5

我在应用程序的整个生命周期中运行了一系列查询。

我目前正在使用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胜利。

但是,我相信临时对象会堆积起来,这可能会导致内存问题。 关闭数据库会清除临时对象。

  • 我应该什么时候打开和关闭数据库连接?(例如应用程序确实进入了后台?)
  • 我应该在内存不足的情况下运行VACUUM吗?
4

1 回答 1

1

数据库不创建和/或保留任何对象(或至少不应该)。C API 只是一种使用 SQL 查询的便捷方式,但一旦执行这些查询,它们就应该被释放。

现在,对于查询的返回对象,它们只是被复制到您的 FMResultSet 中。一旦你释放它们就消失了。

Imo,如果数据库本身不是太大,您应该在您的应用程序委托中保留对它的引用(保证在您的应用程序的生命周期内保持活动状态)。当您从后台进入应用程序/简历时,打开数据库,当您进入后台/关闭时,只需将其关闭。

请记住,AppDelegate 是一个单例(我认为),您可以(AppDelegate*)[[UIApplication sharedApplication]delegate].your_db从应用程序中的任何位置访问您的数据库以执行实际查询。

如果您在收到内存警告时尝试调用 VACUUM,则使用 VACUUM 会使您的应用程序崩溃。想一想:要重新排列数据库,它应该被加载到内存中(或至少一部分),如果你已经有内存警告......噗......崩溃。

您可以测试您的数据库是否将对象保存在内存中。只需以 1 秒的间隔(或按一下按钮)执行 100 次查询,然后在仪器中观察内存在何处以及是否增长。您的应用程序(或包装器本身)可能存在泄漏,并将其归咎于数据库。

于 2013-05-26T16:43:48.140 回答