0

在我的应用程序中,我使用 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();
        }
    }
}

创建 ManagedObject 上下文 (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 的设备上复制此问题。因此不了解用户是否真的看到了此崩溃,以及此错误的后果是什么。

4

1 回答 1

0

您需要将 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
        }()
于 2015-11-06T03:02:19.077 回答