在Android中使用内存中的SQLite数据库

20


我已经阅读、浏览、搜索了很多关于这个问题的资料,我在stackoverflow上反复横跳了很多次,也尽可能地缩小了我的问题范围。

唯一让我不明白的是如何完全使用内存中的SQLite数据库。

这是我的情况——我有一个加密的SQLite数据库,在加载我的应用程序时对其进行解密(这部分肯定有效)。我的与数据库交互的类可以与普通数据库正常工作。 所以简而言之,使用内部手机存储器加载普通数据库时一切都无瑕可挑,但我不确定该如何或者在哪里存储解密后的数据库,使其被“视为”正常的数据库。

我猜我应该在super(context, null, null, 3);中把名称替换为null,并在SQLiteDatabase.openDatabase()的路径处使用:memory:,但我仍然不太理解。它说找不到android_metadata表,但我确定数据库是正确的。

希望我表述清楚了:)


尝试过SQLCipher了吗? - Jens
我没有太多考虑过。一开始研究时,我没找到类似的东西,所以我自己开发了一个双重加密的方法。谢谢你提供的链接,我会看一下的。 你能告诉我SQLCipher有多安全,它是否可以压缩数据吗? - Grandpa
256位AES加密是可以的 - 而且我敢打赌你自己不可能做出更好的实现。 - Jens
3个回答

32

SQLiteOpenHelper() 方法如果传入的 name 参数为 null,则会创建一个内存数据库。请注意,只有在调用getWritableDatabase()方法时才会创建该数据库。

接下来,您应该插入数据。


12

您(或框架)可以使用以下一种方式之一来创建数据库:

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

第一种选项是创建仅存在于内存中的数据库的唯一方法,而其他两个选项会打开或创建一个数据库文件。

因此,如果您正在使用 SQLiteOpenHelper() 并将 name 参数传递为 null,则框架将调用 SQLiteDatabase.create(null),因此您将获得一个仅存在于内存中的数据库(在调用 close() 后它会被删除)。没有必要再调用其他直接方法,而是从您的帮助程序中调用 getReadableDatabase() 或者 getWritableDatabase() 方法。


好的,那么当我调用 myDatabase = SQLiteDatabase.create(null); 后,我如何使用数据库?我有另一个类中作为原始字节的解密后的数据库,我该如何将这些字节合并到已创建的数据库句柄中? - Grandpa
我不相信sqlite3支持从现有的blob“打开”一个:memory:数据库,因此在Android中执行此操作的API可能也不存在。你最好的选择可能是将解密后的数据库流式传输到文件中,在那里可以使用有效路径使用openDatabase()打开它。如果您不想使解密后的数据库持久化,您可以使用查询/插入将数据复制到仅存储在内存中的版本中,然后关闭/删除文件版本。 - devunwired
@Devunwired,当你说“在调用close()时它会死掉”时,你是指SQLiteOpenHelper.close()还是SQLiteDatabase.close()?通过SQLiteDatabase.close()关闭数据库连接会销毁数据库吗? - sotrh

0

通常情况下,内存数据库对于模拟测试实例非常有用。 - mahee96
是的,甚至可以减少对ROM的读写周期。 - Nithesh Bafna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接