如何在Android中将ORMLite与SQLCipher一起使用?

问题描述 投票:16回答:5

我想在我的Android项目中使用OrmLiteSQLCipher,但是这两个库都有自己的抽象SQLiteOpenHelper类来实现。 Java不允许类扩展两个类,如果我单独实现,它们将不会相互通信。

我怎样才能一起工作?如何解决SQLiteOpenHelper实施问题?

android ormlite sqlcipher
5个回答
4
投票

如何在Android中将ORMLite与SQLCipher一起使用?

它应该是@Bruno。

应该工作的一种方法是将ORMLite's OrmLiteSqliteOpenHelper class复制到您的项目中,将其重命名为LocalOrmLiteSqliteOpenHelper或其他内容,并将基类更改为SQLCipher帮助程序类。我不敢相信他们没有将班级改名为SQLCipherSQLiteOpenHelper。 (叽)

public abstract class LocalOrmLiteSqliteOpenHelper
    extends info.guardianproject.database.sqlcipher.SQLiteOpenHelper {

另一种方法是让你的助手扩展SQLCipher的SQLiteOpenHelper,然后自己从OrmLiteSqliteOpenHelper实现你需要的各种东西。然而,这需要更多的工作。在创建数据库时,ORMLite必须与数据库连接做一点跳舞,否则它会递归。

如果其中任何一个工作,请告诉我。


6
投票

我把Rejinderi的答案提炼成了patch for ORMLite 4.43并将其编译成JAR file。要将其集成到Android项目中,请执行以下操作:

  1. 按照SQLCipher for Android HOWTO将SQLCipher导入您的项目
  2. 将ORMLite添加到您的项目中(请参阅What is a good tutorial for using ORMLite with SQLite and Android
  3. libs/ormlite-android.jar替换ormlite-android-sqlcipher.jar
  4. 将您的秘密数据库密码添加到相应的DB打开方法

但是,您不应该相信我提供一个未处理的JAR文件,而是按照补丁中的构建说明进行操作。

编辑:使用修补的库,调用getReadableDatabase()getWritableDatabase()OrmLiteSqliteOpenHelper构造函数需要传递密码作为附加参数。如果您正在使用数据库帮助程序,请适当地扩展它以将密码传递给OrmLiteSqliteOpenHelper。


3
投票

只是为了更新那些需要帮助的人,你可以将ormlite的整个android源代码部分复制到你的项目中,并将android的db包的所有引用的导入更改为SQLCipher的版本。

基本上你必须将所有匹配android.database.sqlite的包更改为net.sqlcipher.database

例如,来自

import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;

之后将db密码参数放入AndroidConnectionSource.java中对getWriteableDatabase的调用


1
投票

应用ge0rg I提供的补丁发现queryForAll()抛出NoSuchMethod exception。经过一番调查后,我发现这是rawQuery返回net.sqlcipher.Cursor的结果,而getQuery(在AndroidCompiledStatement中)返回的游标是android.database.Cursor。我只是将AndoridCompiledStatement的导入修改为:

import net.sqlcipher.Cursor;

并修改了getCursor()以返回android.database.Cursor:

public android.database.Cursor getCursor() { ...

通过这些更改,它似乎对我有用。虽然我需要玩一点才能完全确定。


1
投票

我知道这是一个很老的线程。但最近我不得不采取同样的方式。我已经阅读了两个寻找解决方案的主题:thisthis

  1. 我跟着ge0rg的answer,它几乎工作,是一些问题,我必须替换我的代码中的方法(我想避免它)。
  2. 我做了Eliott Roynette建议的here并且它工作得很好,除了我需要在Helper类中添加一个方法来接受密码而我做到了。
  3. 我想将代码排除在lib中以获得更多智能解决方案而不是代码组合,因此我分别构建了lib /模块。

现在我有solution工作(您可以从GitHub克隆工作演示)。将我的答案放入两个主题中,以便将来帮助其他人。

© www.soinside.com 2019 - 2024. All rights reserved.