2014-01-20 33 views
0

我有一個實體A,它與B有關係。CoreData無法完成未修改關係的錯誤

這裏是從CoreData取出一個陣列:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"isSynchronized = NO"]; 
NSManagedObjectContext *context = [NSManagedObjectContext MR_contextForCurrentThread]; 
NSArray * newWordsToSynchronize = [A MR_findAllWithPredicate:predicate inContext:context]; 
NSMutableArray * newWordsParameters = [NSMutableArray arrayWithCapacity:[asToSynchronize count]]; 
[newWordsToSynchronize enumerateObjectsUsingBlock:^(A * a, NSUInteger idx, BOOL * stop) { 
    NSLog(@"============= may have some problem ============"); 
    NSLog(@"[a hasFaultForRelationshipNamed:@\"b\"] = %d", [a hasFaultForRelationshipNamed:@"b"]); 
    NSLog(@"a.word = %@", a.word); 
    NSLog(@"a.b.objectID = %@", a.b.objectID); 
    NSLog(@"a.managedObjectContext = %@", a.managedObjectContext); 
    NSLog(@"a.b.managedObjectContext = %@", [a.b managedObjectContext]); 
    NSLog(@"a.b.managedObjectContext = %@", [a.b managedObjectContext]); 
    NSLog(@"a.managedObjectContext = %@", a.managedObjectContext); 
    NSDictionary *paramDictionary = @{ 
      @"nbook" : a.b.name, 
      @"lang" : a.lang, 
      ... 
    }; 
    [newWordsParameters addObject:paramDictionary]; 
}]; 

[a.b managedObjectContext]方法可以返回nil時我把它在第二時間,然後該應用去崩潰。

崩潰日誌從控制檯:

2014-01-20 14:29:14.561 MyApp[10563:2e07] a.b.objectID = 0x1754e940 <x-coredata://DFC4F956-D5AC-4264-8717-C07090CA9547/B/p1> 
2014-01-20 14:29:14.561 MyApp[10563:2e07] a.managedObjectContext = <NSManagedObjectContext: 0x1754bc00> 
2014-01-20 14:29:14.561 MyApp[10563:2e07] a.b.managedObjectContext = <NSManagedObjectContext: 0x1754bc00> 
2014-01-20 14:29:14.562 MyApp[10563:2e07] a.b.managedObjectContext = (null) 
*** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0x1754e940 <x-coredata://DFC4F956-D5AC-4264-8717-C07090CA9547/B/p1>'' 
*** First throw call stack: 
(
    0 CoreFoundation      0x037495e4 __exceptionPreprocess + 180 
    1 libobjc.A.dylib      0x034cc8b6 objc_exception_throw + 44 
    2 CoreData       0x031a233b _PFFaultHandlerLookupRow + 2715 
    3 CoreData       0x031a1897 -[NSFaultHandler fulfillFault:withContext:forIndex:] + 39 
    4 CoreData       0x031a1473 _PF_FulfillDeferredFault + 259 
    5 CoreData       0x031a12c6 _sharedIMPL_pvfk_core + 70 
    6 CoreData       0x031e7130 _pvfk_5 + 32 
    7 MyApp      0x00181b00 __68-[CichangAHTTPEngine synchronizeAsOnCompletion:failure:]_block_invoke + 1760 
    8 CoreFoundation      0x037435eb __NSArrayEnumerate + 571 
    9 CoreFoundation      0x03743196 -[NSArray enumerateObjectsWithOptions:usingBlock:] + 102 
    10 CoreFoundation      0x037430a5 -[NSArray enumerateObjectsUsingBlock:] + 53 
    11 MyApp      0x0018105b -[CichangAHTTPEngine synchronizeAsOnCompletion:failure:] + 1179 
    12 MyApp      0x00185d9e __65-[CichangAHTTPEngine downloader:didFinishedDownloadObject:]_block_invoke_3 + 2030 
    13 libdispatch.dylib     0x040717f8 _dispatch_call_block_and_release + 15 
    14 libdispatch.dylib     0x040864b0 _dispatch_client_callout + 14 
    15 libdispatch.dylib     0x04074eeb _dispatch_root_queue_drain + 287 
    16 libdispatch.dylib     0x04075137 _dispatch_worker_thread2 + 39 
    17 libsystem_pthread.dylib    0x04412dab _pthread_wqthread + 336 
    18 libsystem_pthread.dylib    0x04416cce start_wqthread + 30 
) 
libc++abi.dylib: terminating with uncaught exception of type _NSCoreDataException 

我發現B將首先[a.b managedObjectContext]呼叫之後被釋放。

我認爲這主要是由Core Data 1550錯誤引起的(如果我沒有調用[a.b managedObjectContext],Core Data會報告「操作無法完成(Cocoa error 1550.)」)。但是,可能會導致1550錯誤以及如何解決它?

1550錯誤報告:

Error Domain=NSCocoaErrorDomain Code=1550 "The operation couldn’t be completed. (Cocoa error 1550.)" UserInfo=0x167269c0 {NSLocalizedDescription=The operation couldn’t be completed. (Cocoa error 1550.), Dangling reference to an invalid object.=null, NSValidationErrorObject=<A: 0x16bab420> (entity: A; id: 0x16baae50 <x-coredata://A85EE9AB-97C1-43C1-B92E-A6C906F0C1A8/A/p168> ; data: { 
    date = "2014-01-21 02:32:00 +0000"; 
    expect = "2014-01-21 02:31:59 +0000"; 
    isSynchronized = 1; 
    lang = en; 
    last = "2014-01-21 02:01:59 +0000"; 
    level = 1; 
    b = "0x16bab460 <x-coredata://A85EE9AB-97C1-43C1-B92E-A6C906F0C1A8/B/p1>"; 
    status = "-1"; 
    studycount = 0; 
    trans = "v. \U6d4b\U91cf\Uff0c\U6743\U8861 "; 
    word = measure; 
}), NSAffectedObjectsErrorKey=(
    "<B: 0x16babd70> (entity: B; id: 0x16bab460 <x-coredata://A85EE9AB-97C1-43C1-B92E-A6C906F0C1A8/B/p1> ; data: <fault>)" 
), NSValidationErrorKey=newWordBook, NSValidationErrorValue=<B: 0x16babd70> (entity: B; id: 0x16bab460 <x-coredata://A85EE9AB-97C1-43C1-B92E-A6C906F0C1A8/B/p1> ; data: <fault>), NSValidationErrorShouldAttemptRecoveryKey=true} 

如果1550錯誤發生, 「CoreData不能履行故障」 墜毀會更easer造成的。

+0

有沒有後臺操作刪除對象?這些對象是否一直保存到商店/磁盤? –

+0

當應用程序在前臺運行時,我沒有刪除操作,實體「B」永遠不會被刪除。 –

+0

從B到A有反比關係嗎?代表這兩種關係的屬性是怎樣的? – eofster

回答

2

「核心數據無法完成錯誤」真的意味着有刪除。持久性商店中有數據。然後創建表示這些數據的管理對象。該對象是一個錯誤。然後,商店中的數據被刪除。然後訪問一個對象的某些屬性,Core Data試圖完成這個錯誤,但是不能。

如果你沒有做明確的刪除,那麼也要確保沒有發生隱式刪除。當您的某個關係配置了級聯刪除規則時,幕後可能會發生刪除。

在您的示例中,如果從A到B的關係配置了級聯規則並且對象A已被刪除,則可能發生這種情況。

+0

我的刪除規則是:'A'到'B'是無效刪除規則,'B'爲'A'是級聯刪除規則。 –

+0

你確定你沒有混淆方向嗎?如果您選擇實體A然後選擇關係B,那麼規則在那裏是無效的? – eofster

+0

是的,A到B是無效規則,通過訪問B的屬性1+次B將成爲故障並導致'CoreData不能履行故障'錯誤。 –