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

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

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 Free 3-6%,无磁盘57%,运行iOS 10的新型号手机.开始看到这些报告的应用程序版本也是第一个将轻量级核心数据迁移作为其中一部分的版本,我不确定这是否有所作为.我知道98%的用户成功升级到该版本,并且没有任何问题进行迁移.这是报告中的堆栈跟踪.尽管它说的是“device_locked”,但我知道当我尝试保存到持久性存储时,即使用户在应用程序中,也会发生此崩溃.

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

最佳答案 >如果没有同步编译指示,请查看是否可以获得可接受的性能.如果它没有帮助你很多,那么就不需要抓住这个机会了.

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

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

>确保在主线程上创建存储,并确保在主线程上进行迁移.

点赞