2015-11-04 42 views
0

在我的應用程序中,我使用CoreData來保存數據,並且我正在從服務器推送和提取數據。我還使用同一帳戶在多個設備上同步數據。NSPersistentStoreCoordinator沒有持久性存儲。它不能執行保存操作(iOS 9)

但是最近,我從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複製此問題。因此,無法理解用戶是否真的看到了這個崩潰,以及這會導致什麼後果?錯誤。

+0

錯誤是告訴你的是,managedObjectContext有沒有與之相關的持久化存儲。您可能需要取消註釋錯誤處理代碼,因爲您對persistentStoreCoordinator {}的調用可能失敗。 –

+0

嘿@DuncanGroenewald,我的代碼是否正確? – Ranjit

+0

@DuncanGroenewald,我取消註釋並嘗試。但沒有崩潰。 – Ranjit

回答

0

某處你需要與persistentStore的ManagedObjectContext相關聯,這樣(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 
     }() 
+0

嗨,默認代碼是不夠的? – Ranjit

+0

發佈用於創建託管對象上下文的代碼或運行調試會話以在保存時檢查「manageObjectContext.persistentStoreCoordinator」的值。 –

+0

我已經發布了創建託管對象上下文的代碼 – Ranjit

相關問題