我想在我的Android项目中使用OrmLite和SQLCipher,但是这两个库都有自己的抽象SQLiteOpenHelper
类来实现。 Java不允许类扩展两个类,如果我单独实现,它们将不会相互通信。
我怎样才能一起工作?如何解决SQLiteOpenHelper
实施问题?
如何在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必须与数据库连接做一点跳舞,否则它会递归。
如果其中任何一个工作,请告诉我。
我把Rejinderi的答案提炼成了patch for ORMLite 4.43并将其编译成JAR file。要将其集成到Android项目中,请执行以下操作:
libs/ormlite-android.jar
替换ormlite-android-sqlcipher.jar
但是,您不应该相信我提供一个未处理的JAR文件,而是按照补丁中的构建说明进行操作。
编辑:使用修补的库,调用getReadableDatabase()
,getWritableDatabase()
和OrmLiteSqliteOpenHelper
构造函数需要传递密码作为附加参数。如果您正在使用数据库帮助程序,请适当地扩展它以将密码传递给OrmLiteSqliteOpenHelper。
只是为了更新那些需要帮助的人,你可以将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返回net.sqlcipher.Cursor
的结果,而getQuery(在AndroidCompiledStatement中)返回的游标是android.database.Cursor
。我只是将AndoridCompiledStatement的导入修改为:
import net.sqlcipher.Cursor;
并修改了getCursor()以返回android.database.Cursor:
public android.database.Cursor getCursor() { ...
通过这些更改,它似乎对我有用。虽然我需要玩一点才能完全确定。