【问题标题】:How can I use ORMLite with SQLCipher together in Android?如何在 Android 中同时使用 ORMLite 和 SQLCipher?
【发布时间】:2012-02-28 21:52:05
【问题描述】:

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

如何同时使用两者?如何解决SQLiteOpenHelper 的实现问题?

【问题讨论】:

  • SQLCiphers 版本是 SQLiteOpenHelper 的重构版本 - 即它不是同一个类 - 要让这两者很好地协同工作,您将不得不重新设计整个 OrmLite 库以请改用 SQLCipher-packages。
  • 如果 OrmLite 开箱即用,那肯定很棒。如果 SqlCipher 出现在 Maven 工件中也会很好。它们看起来像是两个显然需要相互协作的库(更好)。

标签: android ormlite sqlcipher


【解决方案1】:

我将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. 将您的秘密数据库密码添加到适当的数据库打开方法中

但是,您不应该相信我会提供未经处理的 JAR 文件,而是按照补丁中的构建说明进行操作。

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

【讨论】:

  • 是吗?你的数据库密码是多少? :)
  • 我的是“密码”;但我说的是我提供的 JAR 文件还可能包含 sendCovertMessageTo("ge0rg", your_db_password) 行...
  • 没想到你也这么回答。我想这可以证明你的观点。如果它的大小与原始大小大致相同,您会在哪里找到将信息发送到某处的资源/方法?我真的很好奇。我对 dalvik 的安全性很感兴趣,但了解甚少。
  • 我猜你可以假设应用权限,并捕获未检测到的异常......还有什么?
  • 我们到底在哪里添加密码?
【解决方案2】:

如何在 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 必须与数据库连接做一些小动作,否则它会递归。

让我知道这些是否有效。

【讨论】:

  • 我试过了,但出现编译时错误 EX:" new AndroidConnectionSource(this);"
  • 同样的错误。构造函数 AndroidConnectionSource(OrmLiteSqliteOpenHelper) 未定义。为什么这个答案被接受?
  • 答案已经过时了。它对旧版本的 ORMLite 有效。所以,抱怨的人,请稍等,有人会更新答案
【解决方案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 调用

【讨论】:

  • 感谢您的回答。但是当我使用 queryforall() 获取数据时抛出 java.lang.NoSuchMethodError: net.sqlcipher.database.SQLiteDatabase.rawQuery。但我在 sqlitedatabase 类中有那个方法。如何解决这个任何想法???
  • 我没有进一步探讨这一点。我现在停止使用 SQLCipher,帮不上忙,抱歉。
【解决方案4】:

应用 ge0rg 提供的补丁,我发现 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() { ...

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

【讨论】:

    【解决方案5】:

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

    1. 我关注了 ge0rg 的 answer,它几乎成功了,但有些问题,我必须替换代码中的方法(我想避免它)。
    2. 我按照 Eliott Roynette 的建议 here 做了,效果很好,只是我需要向 Helper 类添加一个方法来接受密码,我做到了。
    3. 我想将代码排除在 lib 中以获得更智能的解决方案而不是代码混合,因此我单独构建 lib/module。

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

    【讨论】:

    • 我在那个项目中编写了自己的 ORM 层,更快更干净。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2014-02-14
    • 2012-11-09
    • 1970-01-01
    • 2012-09-28
    • 2013-04-13
    相关资源
    最近更新 更多