- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在应用商店中有一个应用,我正在使用日志记录服务来获取崩溃日志和相关的日志数据。我看到间歇性崩溃(受影响的用户数量很少,每个用户的崩溃数量也很少),但这让我感到困惑。
这些崩溃发生的情况如下:
应用启动并初始化核心数据栈
应用程序尝试使用以下代码(storeURL
有效)将 SQL 存储添加到 NSPersistentStoreCoordinator:
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @(YES),
NSInferMappingModelAutomaticallyOption : @(YES)
};
sqlStore = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:options
error:&error];
添加该店铺时出现以下错误之一:
NSError:
Domain=NSCocoaErrorDomain
Code=256 "The operation couldn’t be completed. (Cocoa error 256.)"
UserInfo=0x1dd946a0 {NSUnderlyingException=authorization denied, NSSQLiteErrorDomain=23}
或
NSError:
Domain=NSCocoaErrorDomain
Code=256 "The operation couldn’t be completed. (Cocoa error 256.)"
UserInfo=0xc6525d0 {NSUnderlyingException=disk I/O error, NSSQLiteErrorDomain=10}
在这种情况下,应用程序将崩溃 b/c 应用程序运行需要 SQL 存储。我可以尝试通过尝试新的 storeURL 来优雅地处理此故障,但我不希望用户丢失现有数据。此外,我从未亲自重现此问题,并且根据受影响的用户数量和崩溃日志,我认为这是一个影响较小的问题,不会在后续应用程序启动时再次出现。
我希望有一位 Core Data 大师可以就如何调试和预防/处理这些情况提出一些建议。我的核心数据堆栈初始化代码直接来自 xcode 项目生成器,我已经排除了任何并发问题,因为持久存储协调器仅初始化一次(启动时),并且此错误发生在该初始化中。
如果相关,很乐意提供更多代码/信息。
谢谢!
最佳答案
看来 XJones 和我已经找到了原因。它似乎是 iOS 边缘案例错误或未记录的行为。我已将其归档在 Apple 错误 ID 12935031 下。
有一个无法解释的场景,即使用 Core Location 显着位置变化或区域监控的应用程序可能无法正常启动(或产生其他意想不到的后果),因为从 iOS 5 开始,Core Data 存储使用数据保护(默认加密)。
重现步骤:
1) 在设备上开启密码保护
2) 创建一个启动重要位置监控或区域监控的应用程序,即使在后台也能保持启动状态。 IE。使用后台显着位置更改或区域监控的应用。
3)等待设备上的电池电量耗尽(也可能有其他原因)
4) 设备将关闭
5) 将设备连接到 Mac
6) 电量充足后,设备将启动。重要提示:此时不要解锁设备。
7) 退出或进入监控范围或导致位置发生重大变化。该设备现在将自动重新启动该应用程序,因为它注册了重要位置监控或区域监控
8) 但是,由于用户尚未解锁设备(尚未输入密码),应用程序将无法读取其任何 protected 数据文件。在 Core Data 应用程序中,这将导致持久存储协调器无法将持久存储文件添加到托管对象上下文。这将导致应用程序崩溃,或者根据开发人员使用的代码甚至尝试重置数据库。在其他应用程序中,它可能会由于其他原因导致崩溃,因为这是 iOS 5 及更高版本中默认为核心数据存储打开的数据保护功能的意外、未记录的副作用。
在 Apple 更正此问题或至少记录它之前的解决方案或变通方法是确保您的应用程序停止监视 applicationWillTerminate 中的重要位置更改/区域或
通过为 NSFileProtectionKey 设置 NSFileProtectionNone 来关闭默认数据保护功能将核心数据存储添加到持久存储协调器时在选项字典中输入键。
使用 while() 循环检查 protected 数据是否可用,以等待文件存储可用。使用 KVO 可能还有其他方法可以做到这一点,但这种方法工作可靠,并且最容易插入现有代码,而无需重新处理整个应用程序启动过程。
更新:如果数据保护已在商店中激活,那么仅仅设置该 key 似乎是不够的。你必须手动设置它:
<strike></strike>
<strike>
<pre><code>[[NSFileManager defaultManager] setAttributes:[NSDictionary dictionaryWithObject:NSFileProtectionNone forKey:NSFileProtectionKey] ofItemAtPath:storePath error:nil];
</code></pre>
</strike>
<strike></strike>
由于 XJones 的更多输入以及对 Apple 分散文档的更多研究,这是需要后台位置监控的应用程序的修复:
<pre><code>while(![[UIApplication sharedApplication] isProtectedDataAvailable]) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5f]];
}
</code></pre>
此代码在您尝试将存储数据文件添加到持久存储协调器之前进入。
2015 年更新:您还可以将 NSPersistentStoreFileProtectionKey 设置为 NSFileProtectionNone。这将正确禁用文件保护(如果您不需要它)并且无需任何变通方法即可正常工作。它在之前的尝试中不起作用的原因是我测试的字典键不正确。
关于ios - 将 SQL 存储添加到 NSPersistentStoreCoordinator 时如何调试/处理间歇性 "authorization denied"和 "disk i/o"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12845790/
我最近从 xcode 3.x 更新到 4.2,当我在 4.2 中运行应用程序时,我遇到了核心数据问题。我还更新到了 iOS 5,所以问题可能就在那里,我不太确定。 这些应用程序在 3.x 中运行良好,
我正在开发一个使用 Core Data 的 iPhone 应用程序。该应用程序调用 Web 服务,解析生成的 XML 文件,然后在我的应用程序中创建或修改 Core Data 对象。我已经处理了 We
每次我更改应用程序的核心数据模型时,它都会在下次启动时生成不可恢复的错误:“用于打开商店的模型与用于创建商店的模型不兼容”。 我发现避免这种情况的唯一可靠方法是手动删除应用程序并让 Xcode 重新安
在 iOS 应用程序中,我想将 NSPersistentStoreCoordinator 与 NSIncrementalStore 子类一起使用,用于从 REST API 获取数据,但也与 SQLit
我有一个名为 TestProject 的 xcode4 项目,我正在尝试将 CoreData 添加到其中。我添加了一个包含一些实体的数据模型(名为 TestDataModel),并为这些实体创建了 N
我目前已经为我的 iOS 应用程序的当前版本下载了我的崩溃日志。我看到了一条我无法理解的奇怪消息: [NSPersistentStoreCoordinator(_NSInternalMethods)
我目前正在使用 iCloud 和 CoreData 在我的应用程序中同步数据,因此每次触发通知时,我都会更新我的本地数据数组。我遇到的问题是我的数据集越来越大,我不想每次有新通知时都更新整个数据集。
我正在考虑使用两个 persistent store coordinator,PSC1 将仅读取 一个 sqlite DB,PSC2 将读取和写入 DB。有时 PSC1 会从 DB重新加载内容。 你觉
来自 Stanford 193P 的核心数据讲座iTunes 上的 iPhone 类(class),讲师在不使用 NSPersistentStoreCoordinator 的情况下使用 Core Da
我正在尝试在一个项目上使用 Core Data,该项目的代码改编自 iOS 编程:The Big Nerd Ranch Guide(第三版)。打开 SQLite 文件会导致异常,无论阅读多少文档或挖掘
创建persistentStoreCoordinator时,对addPersistentStoreWithType的调用崩溃。使用 Zombies 进行调试会发现释放错误 -[NSRelationsh
我有一个通过 UIManagedObjectDocument 使用核心数据的应用程序。我正在尝试使用加密核心数据 ( https://github.com/project-imas/encrypted
我知道其他开发者也经常问过这个问题。 我正在使用核心数据。 在上次运行代码时,它工作正常,但今天当我构建并运行应用程序时,我发现了此错误。 由于未捕获的异常“NSInvalidArgumentExce
我刚刚设置了一台使用 Xcode 进行开发的新机器,当我打开、构建并运行一个现有的核心数据项目(它在我的旧机器上仍然运行良好)时,我收到“无法创建 NSPersistentStoreCoordinat
由于我遇到的崩溃,我正试图找到一个官方答案,类似于: nil is not a legal NSPersistentStoreCoordinator for searching for entity
我花了很多时间让我的 Core Data 模型在开发中的 iOS 应用程序中高效工作。在大多数情况下,我的一切工作都很顺利,但前几天我偶然遇到了一个独特的错误加载我的数据。我刚开始在我的 iPhone
我已经用(任务)建立了一个模型,在我理解核心数据的过程中,我做到了这一点:向上下文添加三个项目: NSManagedObjectModel *m = [NSManagedObjectModel mer
我有一个运行完美的 coreData 数据模型文件。由于一些特殊要求,我删除旧的数据模型文件并创建了另一个具有完全相同实体的数据模型文件。与之前的数据模型相比,实体没有变化。我已将其作为不同 bund
我已阅读I keep on getting "save operation failure" after any change on my XCode Data Model 错误代码: This
我正在使用 MagicalRecord, 这就是我设置 coreData 堆栈的方式 - (BOOL)application:(UIApplication *)application didFinis
我是一名优秀的程序员,十分优秀!