【问题标题】:CoreData could not fulfill a fault with unmodified relationshipCoreData 无法完成未修改关系的错误
【发布时间】:2014-02-09 06:43:07
【问题描述】:

我有一个实体A,它有一个关系B

这是从 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错误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 无法完成错误”崩溃将更容易导致。

【问题讨论】:

  • 有删除对象的后台操作吗?这些对象是否一直保存到存储/磁盘?
  • 应用在前台运行时我没有删除操作,实体B永远不会被删除。
  • 从 B 到 A 是否存在反比关系?代表这两种关系的属性是什么样的?
  • 是的,BA 是一对多关系,AB 是一对一关系

标签: ios core-data


【解决方案1】:

“Core Data 无法完成故障”实际上意味着存在删除。持久存储中有数据。然后创建代表该数据的托管对象。对象是错误的。然后商店里的数据就被删除了。然后访问了一个对象的某些属性,Core Data 试图解决这个错误,但没有成功。

如果您没有进行显式删除,那么还要确保没有发生隐式删除。当您的关系之一配置了级联删除规则时,可能会在幕后删除。

在您的示例中,如果从 A 到 B 的关系配置了级联规则,并且对象 A 被删除,则可能会发生这种情况。

【讨论】:

  • 我的删除规则是:AB是无效删除规则,BA是级联删除规则。
  • 你确定没有混淆方向吗?如果选择实体A,然后选择关系B,规则在那里无效?
  • 是的,A 到 B 是无效规则,通过 A 访问 B 的属性 1+ 次 B 将成为故障并导致 CoreData could not fulfill a fault 错误。
  • 它必须是某处的删除。如果您将 B 从级联更改为 A 以使其无效,是否有帮助?您是否仔细检查了对 deleteObject: 的所有调用,以确保 B 没有与示例代码并行删除?
  • 另外两个想法。也许您正在使用的上下文正在其他地方重置。或者,当您使用它的对象时,可能没有保留上下文并且正在释放上下文。默认情况下,对象不保留其上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 2018-06-29
相关资源
最近更新 更多