我将Rejinderi的答案提炼为一个ORMLite 4.43补丁,并编译成JAR文件。按照以下步骤将其集成到Android项目中:
ormlite-android-sqlcipher.jar
替换libs/ormlite-android.jar
但是,您不应该相信我提供的未经操纵的JAR文件,请按照补丁中的构建说明进行操作。
编辑:使用补丁过的库,需要将对getReadableDatabase()
、getWritableDatabase()
和OrmLiteSqliteOpenHelper
构造函数的调用添加额外的密码参数。如果您正在使用DB helper,请适当扩展它以将密码传递给OrmLiteSqliteOpenHelper。
sendCovertMessageTo("ge0rg", your_db_password)
的行... - ge0rgOrmLiteSqliteOpenHelper
类复制到您的项目中,将其重命名为LocalOrmLiteSqliteOpenHelper
或其他名称,并更改基类为SQLCipher
帮助类。我无法相信他们没有将该类重命名为SQLCipherSQLiteOpenHelper
。(抱怨)public abstract class LocalOrmLiteSqliteOpenHelper
extends info.guardianproject.database.sqlcipher.SQLiteOpenHelper {
SQLCipher
的SQLiteOpenHelper,然后自己实现您需要的各种内容OrmLiteSqliteOpenHelper
。但这需要更多的工作。ORMlite必须在创建数据库时执行一些与数据库连接相关的操作,否则会出现递归问题。想要帮助的人更新一下,你可以将ormlite的整个android源代码部分复制到你的项目中,并将所有对于android数据库包的引用改为SQLCipher的版本。
基本上你需要将所有匹配android.database.sqlite的包都改为net.sqlcipher.database
例如,从:
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
To
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
应用ge0rg提供的补丁后,我发现queryForAll()
会抛出一个NoSuchMethod exception
。经过一番调查,我发现这是由于rawQuery返回了一个net.sqlcipher.Cursor
,而getQuery(在AndroidCompiledStatement中)返回的游标是一个android.database.Cursor
。我只需修改AndroidCompiledStatement的导入即可:
import net.sqlcipher.Cursor;
并将getCursor()修改为返回android.database.Cursor:
public android.database.Cursor getCursor() { ...
通过这些更改,它对我来说似乎可以工作。虽然我需要再多玩一会儿才能完全确定。