【问题标题】:Using in-memory sqlite android使用内存中的sqlite android
【发布时间】:2012-07-24 07:48:02
【问题描述】:


我一直在阅读、浏览、搜索这方面的内容,我在 stackoverflow 上来回切换了很多次,我设法尽可能地缩小我的问题范围。

我唯一不明白的是,如何充分利用内存中的 SQLite 数据库。

这是我的情况 - 我有一个加密的 SQLite 数据库,我在加载我的应用程序期间对其进行解密(这部分肯定有效)。我与数据库交互的类肯定适用于普通数据库。 因此,简而言之,从手机内部存储器加载的普通数据库完美无缺,但我不确定如何或在何处将解密的数据库存储在内存中,以便将其解释为普通数据库。

我想我应该在super(context, null, null, 3); 中输入null 而不是名称,并在SQLiteDatabase.openDatabase() 中使用:memory: 而不是路径,但我仍然不完全理解。它说它找不到android_metadata 表,但我确定数据库应该是这样的。

希望我对此很清楚:)

【问题讨论】:

  • 试过SQLCipher?
  • 我没有考虑太多。我第一次研究时有点没发现它,所以我开发了自己的两步“加密”。谢谢你的链接,我去看看。你能告诉我 SQLCipher 的安全性如何,它会压缩数据吗?
  • 256 位 AES 加密是可以的 - 我敢打赌,你不可能自己做出更好的实施。

标签: android sqlite in-memory


【解决方案1】:

如果namenullSQLiteOpenHelper() 将创建一个内存数据库。请注意,它会在您调用 getWritableDatabase() 时创建。

那么你应该插入你的数据。

【讨论】:

    【解决方案2】:

    您(或框架)使用以下一个创建数据库:

    • SQLiteDatabase.create()
    • SQLiteDatabase.openDatabase()
    • SQLiteDatabase.openOrCreateDatabase()

    第一个选项是唯一创建内存数据库的方法,其他两个打开或创建数据库文件。

    因此,如果您使用SQLiteOpenHelper() 并且将name 传递为null,则框架会调用SQLiteDatabase.create(null),因此您将获得一个仅存在于内存中的数据库(当close() 被调用时,它就会死掉)。无需调用其他直接方法之一。而是从你的助手那里调用getReadableDatabase()getWritableDatabase()

    【讨论】:

    • 好吧,我打电话给myDatabase = SQLiteDatabase.create(null);后如何使用数据库?我将解密的数据库作为另一个类中的原始字节,如何将这些字节合并到创建的数据库句柄中?
    • 我不相信 sqlite3 支持从现有 blob 中“打开”一个 :memory: 数据库,因此 Android 中的 API 可能也不存在。您最好的选择可能是将您的解密数据库流式传输到一个文件,该文件可以使用openDatabase() 以有效路径打开。如果您不想保留已解密的数据库,您可以使用查询/插入将数据复制到仅内存版本,然后关闭/删除文件版本。
    • @Devunwired,当你说“当close() 被调用时它就死了”,你指的是SQLiteOpenHelper.close(),还是SQLiteDatabase.close()?关闭数据库连接(通过SQLiteDatabase.close())会破坏数据库吗?
    【解决方案3】:

    您必须小心使用内存,因为一旦数据库连接丢失,您的数据就会丢失。确保您的数据库实例未关闭

    https://www.sqlite.org/inmemorydb.html

    【讨论】:

    • 通常内存数据库对于模拟测试实例很有用。
    • 是的,甚至可以减少对 ROM 的读/写周期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2011-06-11
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多