Core Data 中的拒绝规则无法正常工作

Posted

技术标签:

【中文标题】Core Data 中的拒绝规则无法正常工作【英文标题】:Deny rule in Core Data not working propertly 【发布时间】:2010-11-09 10:46:17 【问题描述】:

这是我的对象模型:

一个客户可以有多个项目(可选),但一个项目只能有一个客户(必需)。 一个MemoryEntry 只能有一个Project(可选),同一个Project(可选)可以有不同的MemoryEntry。

删除后:

Client.projects 有拒绝规则 Project.client 有一个无效规则 Project.memos 有拒绝规则 MemoEntry.project 有一个无效规则

在各自的 TableViewController 中删除 Client、Project 或 MemoEntry 时调用的代码:

// Delete the managed object.
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
[context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

NSError *error;
if (![context save:&error]) 
  // Update to handle the error appropriately.
  NSLog(@"MyApp - Unresolved error %@, %@", error, [error userInfo]);
  exit(-1);  // Fail

问题以粗体表示:

如果我创建一个项目然后删除它的父客户端,代码会正确地跟随在IF 语句中。如果我访问“已删除”客户端,它仍然存在,我可以编辑clientName 和其他属性,保存它,一切都很好。我可以去项目并打开项目并查看更新后的客户clientName但是当我通过项目访问客户端时,我的应用退出了。

我的删除规则设置不正确吗?调用[context save:&error] 是否会保存删除,即使它继续出错?有什么想法吗?

*edit - 断点错误停止的行:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:passedManagedObjectContext];

抛出错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'Client''
*** Call stack at first throw:
(
    0   CoreFoundation                      0x30897ed3 __exceptionPreprocess + 114
    1   libobjc.A.dylib                     0x3002f811 objc_exception_throw + 24
    2   CoreData                            0x3162f575 +[NSEntityDescription entityForName:inManagedObjectContext:] + 124
    3   EasyMemo                            0x00008ebb -[EditingViewController viewWillAppear:] + 1478
    4   UIKit                               0x31ec4d9b -[UINavigationController _startTransition:fromViewController:toViewController:] + 610
    5   UIKit                               0x31ec4ac3 -[UINavigationController _startDeferredTransitionIfNeeded] + 182
    6   UIKit                               0x31ebd21b -[UINavigationController pushViewController:transition:forceImmediate:] + 606
    7   UIKit                               0x31ebcfb3 -[UINavigationController pushViewController:animated:] + 34
    8   EasyMemo                            0x000058fd -[DetailProjectViewController tableView:didSelectRowAtIndexPath:] + 368
    9   UIKit                               0x31f7ae6f -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 662
    10  UIKit                               0x31f772af -[UITableView _userSelectRowAtIndexPath:] + 130
    11  Foundation                          0x349c7e8d __NSFireDelayedPerform + 368
    12  CoreFoundation                      0x3084e7fb __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 14
    13  CoreFoundation                      0x3084e2ad __CFRunLoopDoTimer + 860
    14  CoreFoundation                      0x3081f7a5 __CFRunLoopRun + 1088
    15  CoreFoundation                      0x3081f277 CFRunLoopRunSpecific + 230
    16  CoreFoundation                      0x3081f17f CFRunLoopRunInMode + 58
    17  GraphicsServices                    0x31e445f3 GSEventRunModal + 114
    18  GraphicsServices                    0x31e4469f GSEventRun + 62
    19  UIKit                               0x31e51123 -[UIApplication _run] + 402
    20  UIKit                               0x31e4f12f UIApplicationMain + 670
    21  EasyMemo                            0x0000259f main + 70
    22  EasyMemo                            0x00002554 start + 40
)

terminate called after throwing an instance of 'NSException'

【问题讨论】:

【参考方案1】:

NSFetchedResultsController 中包含的被删除对象是什么?

如果-save: 失败,则不会将任何内容写入持久存储并且您的对象不会被删除。这就是您仍然可以访问它们的原因。

至于“但是当我通过项目访问客户端时,我的应用程序退出了。”

什么是错误?

控制台中报告了什么?

在objc_exception_throw 上设置断点,看看究竟是什么导致了崩溃。

【讨论】:

好的,我设置了断点,用它停止的那一行编辑了我的帖子。被删除的对象是客户端。因此,如果我加载项目并访问客户端以显示它,则会出错。【参考方案2】:

发现问题:

我正在使用 Books 示例进行添加。 当我只调用对象而不添加时,我正在传递他们所拥有的addingManagedObjectContext。 所以它是空的......

【讨论】:

以上是关于Core Data 中的拒绝规则无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 一对一关系无法正常工作

Core Data 中的 DENY 删除规则何时真正拒绝删除对象?

Spring Data MongoDB - Criteria API OrOperator 无法正常工作

Firebase 实时数据库规则被拒绝权限

根据官方文档,Asp.net Core 3.0 CORS 无法正常工作

.Net Core MemoryCache PostEvictionCallback 无法正常工作