我想在我的Android项目中使用OrmLite和SQLCipher,但两个库都有自己的抽象SQLiteOpenHelper
类来实现。 Java不允许类扩展两个类,如果我单独实现,它们就不会相互通信。
我如何一起工作?如何解决SQLiteOpenHelper
实施问题?
答案 0 :(得分:6)
我已将Rejinderi的答案提炼为patch for ORMLite 4.43并将其编译为JAR file。要将其集成到Android项目中,请执行以下操作:
libs/ormlite-android.jar
替换为ormlite-android-sqlcipher.jar
但是,您不应该相信我提供未操作的JAR文件,而是遵循补丁中的构建说明。
编辑:使用修补的库,需要将对getReadableDatabase()
,getWritableDatabase()
和OrmLiteSqliteOpenHelper
构造函数的调用作为附加参数传递。如果您使用的是DB帮助程序,请适当扩展以将密码传递给OrmLiteSqliteOpenHelper。
答案 1 :(得分: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
实现你需要的各种东西。然而,这需要更多的工作。
如果其中任何一项有效,请告诉我。
答案 2 :(得分: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密码param放入AndroidConnectionSource.java中getWriteableDatabase的调用中
答案 3 :(得分: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() { ...
通过这些更改,它似乎对我有用。虽然我需要多玩一点才能完全确定。
答案 4 :(得分:1)