代码之家  ›  专栏  ›  技术社区  ›  elcool codeVerine

核心数据中的拒绝规则工作不正常

  •  1
  • elcool codeVerine  · 技术社区  · 14 年前

    这是我的对象模型:

    一个客户机可以有多个项目(可选),但一个项目必须只有一个客户机(必需)。 一个memoEntry只能有一个项目(可选),并且同一个项目可以有不同的memoEntry(可选)。

    object model

    删除时:

    • client.projects具有拒绝规则
    • project.client有一个无效规则
    • project.memos具有拒绝规则
    • memoentry.project有一个无效规则

    在删除客户机、项目或memoEntry时在其各自的TableViewController中调用的代码:

    // 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 和其他属性,保存它,一切都很好。我可以转到项目并打开项目,然后查看更新的客户端 客户名称 . 但当我通过项目访问客户机时,我的应用程序退出。

    我的删除规则设置不正确吗?打电话吗 [context save:&error] 保存删除,即使它出错?有什么想法吗?

    *编辑断点错误停止的行:

    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'
    
    2 回复  |  直到 14 年前
        1
  •  0
  •   Community CDub    7 年前

    您的 NSFetchedResultsController ?

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

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

    错误是什么?

    控制台中报告了什么?

    在上设置断点 objc_exception_throw 看看到底是什么导致了车祸。

        2
  •  0
  •   elcool codeVerine    14 年前

    发现问题:

    我用书本的例子来添加。 我传递的是AddingManagedObjectContext,它们只是调用对象而不添加。 所以它是空的…