我想在我的 Android 项目中使用OrmLite和SQLCipher,但是这两个库都有自己的抽象SQLiteOpenHelper
类来实现。Java不允许一个类扩展两个类,如果我单独实现,它们将不会相互通信。
我怎样才能与两者一起工作?如何解决SQLiteOpenHelper
实施问题?
我已将 Rejinderi 的答案提炼成ORMLite 4.43 的补丁,并将其编译成JAR 文件。要将其集成到您的 Android 项目中,请执行以下操作:
libs/ormlite-android.jar
为ormlite-android-sqlcipher.jar
但是,您不应该相信我会提供未经处理的 JAR 文件并遵循补丁中的构建说明。
编辑:getReadableDatabase()
使用修补库,调用getWritableDatabase()
和OrmLiteSqliteOpenHelper
构造函数需要将密码作为附加参数传递。如果您使用的是 DB 助手,请适当扩展它以将密码传递给 OrmLiteSqliteOpenHelper。
如何在 Android 中同时使用 ORMLite 和 SQLCipher?
@Bruno 应该是可能的。
一种可行的方法是将ORMLite 的OrmLiteSqliteOpenHelper
类复制到您的项目中,将其重命名为LocalOrmLiteSqliteOpenHelper
或其他名称,然后将基类更改为SQLCipher
辅助类。我不敢相信他们没有将课程重命名为SQLCipherSQLiteOpenHelper
. (叽)
public abstract class LocalOrmLiteSqliteOpenHelper
extends info.guardianproject.database.sqlcipher.SQLiteOpenHelper {
另一种方法是让你的助手扩展SQLCipher
SQLiteOpenHelper,然后实现你自己需要的各种东西OrmLiteSqliteOpenHelper
。然而,这将需要更多的工作。在创建数据库时,ORMLite 必须与数据库连接做一些小动作,否则它会递归。
让我知道这些是否有效。
只是为了更新那些需要帮助的人,您可以将 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 调用
应用 ge0rg I 提供的补丁来发现会queryForAll()
抛出NoSuchMethod exception
. 经过一番调查,我发现这是 rawQuery 返回 a 的结果,net.sqlcipher.Cursor
而 getQuery(在 AndroidCompiledStatement 中)返回的游标是android.database.Cursor
. 我只是将 AndoridCompiledStatement 的导入修改为:
import net.sqlcipher.Cursor;
并修改 getCursor() 以返回一个 android.database.Cursor:
public android.database.Cursor getCursor() { ...
通过这些更改,它似乎对我有用。虽然我需要多玩一点才能完全确定。
我知道这是很老的线程。但我最近不得不走同样的路。我已经阅读了两个线程来寻找解决方案:this和this。
现在我有了可行的解决方案(你可以从 GitHub 克隆工作演示)。将我的答案放在两个线程中以在将来帮助其他人。