2014-01-20 2 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] Метод может возвращать ноль, когда я называю его во второй раз, а затем приложение идет сбой.

Краш журнала с консоли:

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 не смог выполнить сбой» аварии будет более проще для вызвать.

+0

Есть ли какие-либо фоновые операции, удаляющие объекты? эти объекты были сохранены вплоть до хранилища/диска? –

+0

У меня нет операций удаления, когда приложение запущено на переднем плане, а сущность 'B' никогда не будет удалена. –

+0

Есть ли обратная связь от B до A? Как выглядят свойства, представляющие обе взаимосвязи? – eofster

ответ

2

«Основные данные не могут выполнить ошибку» на самом деле означает, что произошло удаление. В постоянном хранилище были данные. Затем был создан управляемый объект, представляющий эти данные. Объект был ошибкой. Затем данные в хранилище были удалены. Затем было доступно некоторое свойство объекта, и Core Data попытался выполнить ошибку, но не смог.

Если вы не выполняете явные удаления, то также убедитесь, что неявные удаления не выполняются. Удаление за кулисами может произойти, если одно из ваших отношений было настроено с правилом удаления каскада.

В вашем примере это может произойти, если отношение от A до B было настроено с каскадным правилом, а объект A был удален.

+0

Мое правило удаления: 'A' to' B' является nullify rule rule, 'B' для 'A' - это правило исключения каскада. –

+0

Вы уверены, что не путаете направление? Если вы выберете сущность A, а затем отношение B, это правило будет сбрасывать на нет? – eofster

+0

Да, от A до B отменяется правило, через свойство доступа B в 1+ раз B станет ошибкой и вызовет ошибку CoreData не выполнить ошибку. –

Смежные вопросы