2017-03-04 127 views
3

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

enter image description here

+0

“NSSQLitePragmasOption”选项的目标是什么?@ {@“synchronous”:@“OFF”}'? –

+0

写入磁盘的速度。你认为这可能会导致腐败? – haplo1384

+0

绝对。从http://sqlite.org/pragma.html#pragma_synchronous:“如果运行SQLite的应用程序崩溃,数据将是安全的,但数据库可能会损坏我感谢乔恩,”但我是“应用程序运行sqlite”我的 –

回答

1
  1. 看看你是否可以不同步编译获得可接受的性能。如果它对你没什么帮助,那么就没有必要抓住这个机会。

  2. 我看到你已经有了能够有效检测到事情已经过去的代码......当你点击它时,你可以通过简单地删除SHM和WAL文件来看到会发生什么。这可能只是那些搞砸了。如果确实能够从服务器数据恢复,并且确实很少发生,那么按照您所说的删除整个数据库(如果#2不起作用)就可以接受。

  3. 确保您正在主线程上创建存储,并确保迁移正在主线程上进行。

+0

我试图没有同步标志,并验证主线程创建/迁移。 – haplo1384

0

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

相关问题