16

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

我怎样才能与两者一起工作?如何解决SQLiteOpenHelper实施问题?

4

5 回答 5

6

我已将 Rejinderi 的答案提炼ORMLite 4.43 的补丁,并将其编译成JAR 文件。要将其集成到您的 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.jarormlite-android-sqlcipher.jar
  4. 将您的秘密数据库密码添加到适当的数据库打开方法

但是,您不应该相信我会提供未经处理的 JAR 文件并遵循补丁中的构建说明。

编辑:getReadableDatabase()使用修补库,调用getWritableDatabase()OrmLiteSqliteOpenHelper构造函数需要将密码作为附加参数传递。如果您使用的是 DB 助手,请适当扩展它以将密码传递给 OrmLiteSqliteOpenHelper。

于 2013-02-08T14:30:03.913 回答
4

如何在 Android 中同时使用 ORMLite 和 SQLCipher?

@Bruno 应该是可能的。

一种可行的方法是将ORMLite 的OrmLiteSqliteOpenHelper复制到您的项目中,将其重命名为LocalOrmLiteSqliteOpenHelper或其他名称,然后将基类更改为SQLCipher辅助类。我不敢相信他们没有将课程重命名为SQLCipherSQLiteOpenHelper. (叽)

public abstract class LocalOrmLiteSqliteOpenHelper
    extends info.guardianproject.database.sqlcipher.SQLiteOpenHelper {

另一种方法是让你的助手扩展SQLCipherSQLiteOpenHelper,然后实现你自己需要的各种东西OrmLiteSqliteOpenHelper。然而,这将需要更多的工作。在创建数据库时,ORMLite 必须与数据库连接做一些小动作,否则它会递归。

让我知道这些是否有效。

于 2012-02-07T17:30:22.340 回答
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 密码参数放入 AndroidConnectionSource.java 中的 getWriteableDatabase 调用

于 2012-11-01T02:46:07.887 回答
1

应用 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() { ...

通过这些更改,它似乎对我有用。虽然我需要多玩一点才能完全确定。

于 2013-12-11T12:10:50.973 回答
1

我知道这是很老的线程。但我最近不得不走同样的路。我已经阅读了两个线程来寻找解决方案:thisthis

  1. 我遵循了 ge0rg 的回答,它几乎起作用了,但有一些问题,我必须替换代码中的方法(我想避免它)。
  2. 我做了 Eliott Roynette在这里建议的事情,它工作得很好,除了我需要向 Helper 类添加一种方法来接受密码并且我做到了。
  3. 我想将代码排除在 lib 中以获得更智能的解决方案而不是代码混合,因此我单独构建 lib/module。

现在我有了可行的解决方案(你可以从 GitHub 克隆工作演示)。将我的答案放在两个线程中以在将来帮助其他人。

于 2014-09-18T09:11:23.827 回答