Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用内存中的sqlite android_Android_Sqlite_In Memory - Fatal编程技术网

使用内存中的sqlite android

使用内存中的sqlite android,android,sqlite,in-memory,Android,Sqlite,In Memory,我一直在阅读,浏览,搜索这方面的很多东西,我已经来回穿梭了很多次,我设法尽可能缩小我的问题 我唯一不明白的是,如何充分利用内存中的SQLite数据库 这是我的情况——我有一个加密的SQLite数据库,我在加载应用程序的过程中对其进行解密(这部分可以肯定)。我的与数据库交互的类肯定能在普通数据库中工作。 简而言之,从手机内部存储器加载的普通DB是完美的,但我不确定如何或在哪里将解密后的DB存储在内存中,以便将其解释为正常DB 我想我应该在super(context,null,null,3)中放置n


我一直在阅读,浏览,搜索这方面的很多东西,我已经来回穿梭了很多次,我设法尽可能缩小我的问题

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

这是我的情况——我有一个加密的SQLite数据库,我在加载应用程序的过程中对其进行解密(这部分可以肯定)。我的与数据库交互的类肯定能在普通数据库中工作。 简而言之,从手机内部存储器加载的普通DB是完美的,但我不确定如何或在哪里将解密后的DB存储在内存中,以便将其解释为正常DB

我想我应该在
super(context,null,null,3)中放置
null
而不是名称并使用
:内存:
而不是
SQLiteDatabase.openDatabase()
中的路径,但我仍然不完全理解。它说它找不到一个
android\u元数据
表,但我确信数据库应该是这样的

希望我已经清楚了:)

如果
名称
null
,则将创建内存中的数据库。请注意,它将在调用
getWritableDatabase()
时创建

然后您应该插入数据。

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

  • SQLiteDatabase.create()
  • SQLiteDatabase.openDatabase()
  • SQLiteDatabase.openOrCreateDatabase()
第一个选项是创建仅内存数据库的唯一方法,另外两个选项打开或创建数据库文件


因此,如果您正在使用
SQLiteOpenHelper()
并将
name
传递为
null
,框架将调用
SQLiteDatabase.create(null)
,因此您将得到一个只存在于内存中的数据库(当调用
close()
时,它将死亡)。不需要同时调用其他直接方法之一。相反,从您的助手处调用
getReadableDatabase()
getWritableDatabase()

您必须小心使用inmemory,因为一旦数据库连接断开,您的数据将丢失。确保数据库实例未关闭


试过了吗?我没怎么想。我刚开始研究的时候没有找到它,所以我开发了自己的两步“加密”。谢谢你的链接,我来看看。你能告诉我SQLCipher有多安全吗?它是否压缩数据?256位AES加密是可以的-我敢打赌,你自己不可能实现得更好。好吧,那么,在调用
myDatabase=SQLiteDatabase.create(null)之后,我如何使用数据库?我在另一个类中将解密的DB作为原始字节,如何将这些字节合并到创建的DB句柄中?我不相信sqlite3支持从现有blob“打开”a:memory:database,因此Android中这样做的API可能也不存在。您的最佳选择可能是将解密后的数据库流式输出到一个文件中,在该文件中可以使用
openDatabase()
以有效路径打开该数据库。如果不想保留解密后的数据库,可以使用查询/插入将数据复制到仅内存的版本中,然后关闭/删除文件版本。@Devunwired,当您说“调用
close()
时,它将消失”,您指的是
SQLiteOpenHelper.close()
,还是
SQLiteDatabase.close()
?关闭数据库连接(通过
SQLiteDatabase.close()
)会破坏数据库吗?