2012-05-11 112 views
0

我已經看過所有發佈報告問題的帖子managedObjectContext save: 但是,我沒有發現任何似乎解決了我所看到的問題的任何內容。大多數人都有與tableView協調FRC的問題。這是不同的。NSManagedObjectContext保存方法拋出異常

當我調用保存在NSManagedObjectContext實例上時,會暴露此問題。捕獲和記錄異常讀取:「無法執行集合評估與非集合對象」。有沒有人有線索可能意味着什麼?

@try { 
     if ([self.managedObjectContext hasChanges]) { 
      @synchronized(managedObjectContext) { 
       if(![managedObjectContext save:&error]) { 
        NSLog(@"\n\n---------UNRESOLVED ERROR--------------\n\n UserInfo: \n%@, %@", error, [error userInfo]); 
        [self.managedObjectContext rollback]; 
       } 
      } 
     } 
    } 
    @catch (NSException *exception) { 
     NSLog(@"\n\n---------UNRESOLVED ERROR--------------\n\n exception: \n%@\n%@", exception, error); 
    } 

我唯一的線索是這個問題的可重複性。這發生在我將保留的fetchedResultsController訪問器清零後,然後用一組謂詞實例化一個新的。

 if(searchFetchedResultsController) { 
      self.searchFetchedResultsController = nil; 
     } 

     self.searchFetchedResultsController = [predicateBuilder createSearchInContext:managedObjectContext forDelegate:self withSortDescriptors:self.sortDescriptors forEntityName:@"Record"]; 

     NSError *error = nil; 
     [self.searchFetchedResultsController performFetch:&error]; 

     if(error) 
      NSLog(@"\nfetch error: %@", error); 

我稍後將通過使用普通存取器構造保留一個新的NSFetchedResultsController,而不帶謂詞。

 if(fetchedResultsController) { 
      self.fetchedResultsController = nil; 
     } 

     NSError *error = nil; 
     if (![self.fetchedResultsController performFetch:&error]) { 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 

我稍後將添加一個Record managedObject;保存;並運行保存引發的異常。

有趣的是,這種情況每次都會發生,只有當我的謂詞正在查詢數字或日期時。它在查詢字符串時發生而不是。所以,我想我的查詢結構似乎是唯一的區別。事實是,兩者都在創建有效的謂詞(通過SUBQUERY),因爲獲取不會失敗。所以,如果有差異,我不能告訴你它可能是什麼。

其他值得注意的事情是每一個I「的alloc」一個FRC它看起來像這樣的地方:

[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 

注意零cacheName和sectionNameKeyPath

我用兩個指針澄清我的預測FRC與非預測FRC。我知道如果我沒有提到它,就會發現一些錯誤。

-(void) setSearchFilteredNames:(BOOL)boolValue { 
    searchFilteredNames = boolValue; 
    if(boolValue) { 
     self.searchFetchedResultsController.delegate = self; 
     self.fetchedResultsController.delegate = nil; 
     //self.fetchedResultsController = nil; //lazy regeneration 
    } else { 
     self.searchFetchedResultsController.delegate = nil; 
     //self.searchFetchedResultsController = nil; //lazy regeneration 
     self.fetchedResultsController.delegate = self; 
    } 
} 

此外,當我捕捉到異常,新的對象是持久的。

回答

2

我想我是工作到太晚......

從我所收集,這是不好的做法是使用子查詢來填充NSPredicates當有關鍵路徑中沒有一對多的關係感興趣的屬性數據模型。

這真是令人困惑,因爲搜索仍然會執行,並返回我期望的結果。直到我添加了一個FRC的新管理對象,這與我的SUBQUERY謂詞無關,這個問題才表現出來。

我希望這可以幫助別人......

+0

非常感謝您的回答,它對我的​​幫助非常大。難以置信地混淆了爲什麼最初執行搜索,但添加/刪除時崩潰。 YOU DA MAN –

+0

@Josh O'Connor很高興爲您提供幫助。自從我挖掘這些戰壕以來,我只能希望CoreData變得更好。您的評論不會有太多的建議。事後看來,我應該直接去SQLite ......我會在那裏咬我的舌頭。 – stephen