【问题标题】:NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.(iOS 9)NSPersistentStoreCoordinator 没有持久存储。它无法执行保存操作。(iOS 9)
【发布时间】:2016-02-04 20:28:13
【问题描述】:

在我的应用程序中,我使用 CoreData 来保存数据,并且我正在从服务器推送和拉取数据。我还使用同一个帐户在多台设备上同步数据。

但是最近,我从 crashLytics 报告中得到了这个崩溃。

This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation

所以在下面的函数中,我以这种方式调用“saveContext”方法。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
    {
         AppDelegate *appDelegate = (AppDelegate *)[[UIApplication  sharedApplication]  delegate]; 

 //Creating a new instance of an managed object.
        Entity *cycle = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:appDelegate.managedObjectContext];

        [cycle setEmailID:m_emailId];
        [cycle setStartDate:dateFromServer];
        [cycle setEndDate:dateFromServer];   



       [appDelegate saveContext];
    }


//appDelegate.m

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil)
    {
        return _persistentStoreCoordinator;
    }

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

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
    {

         */
        //NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        //abort();
    }

    return _persistentStoreCoordinator;
}

- (void)saveContext
{
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil)
    {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
        {            
             */
            // NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            //abort();
        }
    }
}

创建托管对象上下文 (MOC)

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil)
    {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
         _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }

    return _managedObjectContext;
}

所以我没有什么疑问。

1) 我应该每次都调用"[appDelegate saveContext]",数据是从服务器接收的,还是应该只在应用退出时保存。

2) CrashLytics 报告指向"[appDelegate saveContext]"。这也发生在 iOS 9 上。

3) 我无法在运行 iOS 9 的设备上复制此问题。因此不了解用户是否真的看到此崩溃,以及此错误的后果是什么。

【问题讨论】:

  • 错误告诉您 managedObjectContext 没有与之关联的持久存储。您可能需要取消注释您的错误处理代码,因为您对 persistentStoreCoordinator{} 的调用可能会失败。
  • 嘿@DuncanGroenewald,我的代码正确吗?
  • @DuncanGroenewald,我取消注释并尝试过。但没有崩溃。
  • 使用用户的设备可能空间不足或类似情况,您需要更优雅地处理错误,而不是注释掉中止并让它运行直到出现其他问题。大概您在日志中没有看到很多这种崩溃?
  • @Wain 我在日志中看到很多崩溃。此外,它们的 RAM 较少,只有 141MB,但它们有 18GB 空间,这些数据来自崩溃日志。

标签: ios objective-c core-data nspersistentstore


【解决方案1】:

您需要将 ManagedObjectContext 与 persistentStore 关联的地方,如下所示(Swift 代码):

lazy var managedObjectContext: NSManagedObjectContext? = {
        // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
        let coordinator = self.persistentStoreCoordinator
        if coordinator == nil {
            FLOG(5, message: " Error getting managedObjectContext because persistentStoreCoordinator is nil")
            return nil
        }
        var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
        managedObjectContext.persistentStoreCoordinator = coordinator

        // Set the MergePolicy to prioritise external inputs
        let mergePolicy = NSMergePolicy(mergeType:NSMergePolicyType.MergeByPropertyStoreTrumpMergePolicyType )
        managedObjectContext.mergePolicy = mergePolicy

        return managedObjectContext
        }()

【讨论】:

  • 发布用于创建托管对象上下文的代码或运行调试会话以在保存时检查manageObjectContext.persistentStoreCoordinator 的值。
猜你喜欢
  • 2013-03-07
  • 2020-05-30
  • 2012-08-18
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2019-11-12
  • 2011-10-20
  • 2023-03-16
相关资源
最近更新 更多