gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:29:52 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com