带有 FMDB 的 iOS SQLite 在仅通过 TestFlight 分发临时构建时不断报告“内存不足”错误

Posted

技术标签:

【中文标题】带有 FMDB 的 iOS SQLite 在仅通过 TestFlight 分发临时构建时不断报告“内存不足”错误【英文标题】:iOS SQLite with FMDB keeps reporting 'out of memory' error while distributing adhoc build via TestFlight only 【发布时间】:2014-07-15 01:46:04 【问题描述】:

我正在使用 FMDB 在我最新的 ios 项目中使用 SQLite(支持 iOS SDK 7.0 及更高版本)。在开发过程中,一切都像魅力一样运作,我喜欢这个包装器。我已经在模拟器上测试并直接构建到设备(我的设备是 iPhone 5C 和 iPad mini 2),没有发生任何问题。

但是当我通过 TestFlight 向我的测试人员分发 Ad-hoc 构建(使用我的开发人员证书和配置)时,事情就变糟了。他们可以成功下载并安装我的应用程序,但是当它启动时,屏幕上会出现“内存不足”错误。

我检查了其他一些 SO 问题并确保每个 FMResultSet * 在使用后都关闭。但是当我使用 iTools 探索应用程序的目录结构时,令人惊讶的是没有创建数据库文件,这意味着 FMDB 无法打开 SQLite 数据库文件并抛出误导性的“内存不足”错误。所以我尝试创建数据库文件:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *appBundleName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
NSString *dbPath = [paths[0] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.sqlite", appBundleName]];
_database = [FMDatabase databaseWithPath:dbPath];

NSString *appBundleName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
_database = [FMDatabase databaseWithPath:[NSString stringWithFormat:@"/tmp/%@.sqlite", appBundleName]];

tmp 文件夹中创建 foo-bar.sqlite

_database = [FMDatabase databaseWithPath:@"/tmp/tmp.db"]];

FMDB tutorial 显示的究竟是什么

但没有运气。 .sqlite/.db 文件仍未创建。

有人遇到过这个问题,或者有什么建议可以帮助我摆脱这个困境吗?

提前致谢。

【问题讨论】:

/tmp 不是有效的 iOS 路径。您需要来自应用程序沙箱内部的真实路径。它必须是可写路径,这意味着不在您的资源包中。 @rmaddy 我已经尝试使用 Documents 文件夹的路径(在我的应用程序的沙箱中),但仍然没有创建 sqlite 文件(请参阅上面的第一次尝试) 您好,感谢您的快速回复。我发现了问题。这是因为当我创建数据库和表时,我是在主线程中进行的,但是在查询表时,我是在后台线程中进行的 (dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^) 这会导致误导 'out内存错误。所以问题是,如何在后台线程中查询表? 【参考方案1】:

我相信您在 github 存储库中也提到了这一点,但基本答案是:使用 FMDatabaseQueue。

【讨论】:

以上是关于带有 FMDB 的 iOS SQLite 在仅通过 TestFlight 分发临时构建时不断报告“内存不足”错误的主要内容,如果未能解决你的问题,请参考以下文章

FMDB 如何让 sqlite 更简单 iOS?

带有 FMDB 包装器的 Sqlite 数据库不插入数据

iOS之sqlite和FMDB

iOS开发--SQLite重要框架FMDB的使用

iOS sqlite/FMDB 更新不起作用

如何在 IOS Swift 中使用 SQLite 使用 FMDB 处理多个线程