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

时间:2012-02-07 13:05:06

标签: android ormlite sqlcipher

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

我如何一起工作?如何解决SQLiteOpenHelper实施问题?

5 个答案:

答案 0 :(得分: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. 将您的秘密数据库密码添加到相应的数据库开放方法
  5. 但是,您不应该相信我提供未操作的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实现你需要的各种东西。然而,这需要更多的工作。

,ORMLite必须在创建数据库的同时与数据库连接进行一些跳舞。否则它会递归。

如果其中任何一项有效,请告诉我。

答案 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)

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

  1. 我关注ge0rg的answer,它几​​乎有效,有些问题,我必须替换代码中的方法(我想避免它)。
  2. 我做了Eliott Roynette建议的here并且它工作得很好,除了我需要为Helper类添加一个方法来接受密码而且我做了。
  3. 我想将代码排除在lib中以获得更多智能解决方案而不是代码组合,所以我单独构建了lib / module。
  4. 现在我有solution可以工作(你可以从GitHub克隆工作演示)。将我的答案放入两个主题中,以便将来帮助其他人。