核心数据崩溃 - NSPersistentStoreCoordinator没有持久存储(损坏的文件)

时间:2017-03-04 15:19:44

标签: ios core-data crash

我看到一些有这个标题的崩溃报告:

NSPersistentStoreCoordinator没有持久存储(损坏的文件)。它无法执行保存操作。我将持久性存储添加到协调器的代码如下:

    NSURL *applicationDocumentsDirectory = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].lastObject;

    NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"myDatabase.sqlite"];

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"myDataModel" withExtension:@"momd"];

    NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    NSDictionary *storeOptions = @{NSInferMappingModelAutomaticallyOption:@YES,
                                   NSMigratePersistentStoresAutomaticallyOption:@YES,
                                   NSSQLitePragmasOption:@{@"synchronous": @"OFF"}};

    // Create the persistent store.
    self.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
    NSError *error = nil;
    if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                       configuration:nil
                                                                 URL:storeURL
                                                             options:storeOptions
                                                               error:&error])
   {

    }

我已经记录了'addPersistentStoreWithType'调用产生的错误,它是以下内容:

NSCocoaErrorDomain 259
NSSQLiteErrorDomain = 11;
NSUnderlyingException = "Fatal error. The database at <path> is corrupted. SQLite Error code:11, 'database disk image is malformed'

我认为这意味着核心数据库是无法恢复的。是这样的吗?我有一个破坏核心数据库并从我的服务器重新填充的备份计划,但我想知道它是否肯定是不可恢复的,如果有任何我可以做的,以找出它可能首先发生的原因。

其他一些信息:

崩溃报告记录RAM免费3-6%,无磁盘57%,运行iOS 10的新型号手机。开始看到这些报告的应用程序版本也是第一个轻量级核心数据迁移的版本它,我不确定这是否有所作为。我知道98%的用户成功升级到该版本,并且没有任何问题进行迁移。这是报告中的堆栈跟踪。尽管它说的是“device_locked”,但我知道只要我尝试保存到持久性存储,就会发生这种崩溃,即使用户在应用程序中也是如此。

enter image description here

2 个答案:

答案 0 :(得分:2)

  1. 在没有同步编译指示的情况下查看是否可以获得可接受的性能。如果它对你没有多大帮助,那么就不需要抓住这个机会了。

  2. 我看到你已经拥有了能够有效检测出事情发生的代码......当你点击它时,你可以通过简单地删除SHM和WAL文件来看到会发生什么。它可能只是那些搞砸了。

  3. 如果您确实能够从服务器数据中恢复,并且它确实很少发生,那么就像您所说的那样可以接受并删除整个数据库(如果#2无效)

  4. 确保您在主线程上创建商店,并确保在主线程上进行迁移。

答案 1 :(得分:0)

我遇到了同样的问题,我的解决方案是删除应用程序并因数据库中的修改而再次安装它。