我在应用的整个生命周期中运行一系列查询。
我目前正在使用 FMDB (围绕 Sqlite C API 的 Objective-C 包装器),我在每次查询之前打开和关闭。
FMDatabase * db = [FMDatabase databaseWithPath:pathToMyDB];
[db open]
FMResultSet * s = [db executeQuery:@"SELECT * FROM myTable"];
// Use FMResultSet
[db close];
打开和关闭触发器 fopen()
和 fclose()
降低,所以我相信我可以通过保持数据库打开来获得 perforce 胜利。
但是,我相信临时对象会堆积起来,这可能会导致内存问题。 Closing the database清除临时对象。
- 我应该什么时候打开和关闭数据库连接? (例如,应用程序确实进入了后台?)
- 我应该运行 VACUUM 吗?在内存不足的情况下?
最佳答案
数据库不创建和/或保留任何对象(或者至少不应该)。 C API 只是使用 SQL 查询的便捷方式,但一旦执行这些查询,就应该发布它们。
现在,对于查询的返回对象,它们只是被复制到您的 FMResultSet 中。一旦您释放它们,它们就消失了。
Imo,如果数据库本身不是太大,您应该在您的应用程序委托(delegate)中保留对它的引用(保证在您的应用程序的生命周期中存在)。当您进入应用程序/从后台恢复时打开数据库,当您进入后台/关闭时只需关闭它。
请记住,AppDelegate 是一个单例(我认为),您可以使用 (AppDelegate*)[[UIApplication sharedApplication]delegate].your_db
从应用程序的任何位置访问您的数据库以执行实际查询。
如果您在收到内存警告时尝试调用它,使用 VACUUM 会使您的应用程序崩溃。想一想:要重新排列数据库,它应该加载到内存中(或至少是内存的一部分),如果你已经有内存警告......噗......崩溃。
您可以测试您的数据库是否将对象保存在内存中。只需以 1 秒的间隔(或按下按钮)执行大约 100 个查询,然后在内存增长的地方和是否增长的仪器中观察。您的应用程序(或包装器本身)可能存在泄漏,您将其归咎于数据库。
关于ios - 在 iOS 生命周期中何时打开和关闭 SQlite 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16761040/