ios - 在 iOS 生命周期中何时打开和关闭 SQlite 数据库?

标签 ios cocoa-touch sqlite memory-management

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

我目前正在使用 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/

相关文章:

ios - SecItemAdd() 返回 errSecInteractionNotAllowed (-25308)

html - 我可以使用 Xcode 将文件写入 HTML 文件,然后将其加载到 Web View 中吗?

objective-c - 如何比较两个 CGSize 变量?

objective-c - NSURLConnection GET 和 POST 不工作

ios - 在 UIButton 上的透明 imageView 图像后面插入 UIVisualEffectView

ios - NBA 数据 JSON 解析 Swift

iphone - 导航栏按钮,根据点击更改 IBAction

php - Soap 服务器 - 性能问题(可能与 SQLite 相关)

sqlite - 如何为用户添加选项以从连接到他的谷歌帐户的移动应用程序备份他的个人文件(文本)?

sql - SQLite3::SQLException:Rails应用没有这样的表