核心数据:-deleteObject:崩溃,删除规则是原因吗?

2024-03-20

我有以下模型,如图所示。

替代文本http://img521.imageshack.us/img521/9741/schermata20100224a12251.png http://img521.imageshack.us/img521/9741/schermata20100224a12251.png

我的应用程序需要刷新 B 的每个实例,因此每次viewWillAppear,我需要删除模型中的所有 B。删除B后,与C的关系的级联删除规则将删除所有C,然后级联到所有D。 A 和 E 是常数。

我对每个对象都有删除规则,如下所示:

A: b - Cascade
B: c - Cascade, a - Nullify
C: b - Nullify, d - Cascade
D: c - Nullify, e - Nullify
E: d - Cascade

or

A -(cascade)->> B -(cascade)-> C -(cascade)->> D -(nullify)-> E
A <-(nullify)- B <-(nullify)- C <-(nullify)- D <-(nullify) E

我在所有 B、C、D 上级联删除时遇到问题。我的 fetchRequest 对象返回 A 中 B 的每个实例,然后我调用-deleteObject:在来自 ManagedObjectContext 的每个 B 上。但调用 [managedObjectContext save:&error] 时出现 EXC_BAD_ACCESS.

有人可以告诉我我做错了什么吗?我在每个实体上的删除规则都遇到问题还是问题出在其他地方?处理三个对象 B、C、D 的级联删除的最佳实践是什么?

Edited:

这是引发错误时的堆栈跟踪:

  #0    0x01d843ae in ___forwarding___
  #1    0x01d606c2 in __forwarding_prep_0___
  #2    0x01c618b6 in -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:]
  #3    0x0003263a in _nsnote_callback
  #4    0x01d4f005 in _CFXNotificationPostNotification
  #5    0x0002fef0 in -[NSNotificationCenter postNotificationName:object:userInfo:]
  #6    0x01bc217d in -[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:]
  #7    0x01c21763 in -[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:]
  #8    0x01ba65ea in -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:]
  #9    0x01bdc728 in -[NSManagedObjectContext save:]

这是当我尝试将 NSZombieEnabled 和 MallocStackLogging 设置为 YES 时控制台中的日志:

  2010-02-24 15:41:39.803 Foo[2591:207] deleting object: FUM5
  2010-02-24 15:41:40.515 Foo[2591:207] *** -[viewController controllerWillChangeContent:]: message sent to deallocated instance 0x7e54510

编辑 2:添加源代码

我尝试通过创建一个具有图像中确切架构的新项目来重新创建这种情况。你可以从这里下载 http://www.2shared.com/file/11640639/4e825b57/CoreDataTestDeleteRule.html。还有一个自述文本。希望我提供了足够的信息。


我相信问题可能在于 C 和 D 之间的必需关系。如果您将图表配置为:

  1. 每个 C 至少需要一个 D。
  2. C 的许多实例都指向同一个 D。

然后在某个时刻,C 可能会发现它所需的关系已被取消。如果它尝试访问 D,则会触发 EXC_BAD_ACCESS。 (如果每个E需要一个D,你可能会遇到同样的问题)

为了调试我建议,

  • 将关系 C-->D 设置为可选,然后查看错误是否消失。
  • 从 C-->D 开始,每次将级联更改为空 1,然后查看错误是否消失。
  • 如果您有类,请检查实例是否不共享实体图之外的某些公共对象。例如,C 类和 D 类都引用同一图像,但该图像不是实体的一部分。如果外部引用没有正确保留,也可能导致类似的崩溃。
  • 将您的保存移至删除每个 B 的调用之后。在删除之前记录每个 B 及其 C。这样您就可以准确地看到保存是否失败以及保存失败时图表处于什么状态。

Edit01:

好的,我看了你的代码,发现了问题。

问题是您将 A 的“b”关系设置为必需。当你删除 B 时,它会抛出此错误:

2010-02-24 16:14:02.064 CoreDataTestDeleteRule[20887:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=1580 UserInfo=0x3d0b450 "Operation could not be completed. (Cocoa error 1580.)"
2010-02-24 16:14:06.340 CoreDataTestDeleteRule[20887:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=1580 UserInfo=0x3d19980 "Operation could not be completed. (Cocoa error 1580.)", {
    NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1580.)";
    NSValidationErrorKey = b;
    NSValidationErrorObject = <A: 0x3b2faf0> (entity: A; id: 0x3d05330 <x-coredata://6870AF7C-E28F-4B4E-80AB-09C648651179/A/p1> ; data: {
    b =     (
    );
    name = a;

(顺便说一句,数字核心数据错误代码的文本错误可以在CoreDataErrors.h.)

这是有道理的,因为您要求 A 有一个 b,然后删除所有 b。只需将 A->>B 关系设置为可选即可防止错误并允许代码正常运行。

您的代码还存在一些其他问题。一些自动生成的类没有正确显示。例如,B.h 的接口如下所示:

#import <CoreData/CoreData.h>

@class A;

@interface B :  NSManagedObject  
{
}

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) A * a;
@property (nonatomic, retain) NSManagedObject * c;

@end

当它应该看起来像:

#import <CoreData/CoreData.h>

@class A;
@class C;

@interface B :  NSManagedObject  
{
}

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) A * a;
@property (nonatomic, retain) C * c;

@end

我不知道为什么他们没有正确生成。

我还建议不要使用短变量和类名。 Objective-c 具有全局名称空间,使用单字母符号会导致名称冲突。你永远不知道还有谁在匆忙。我建议使用旧的二战风格的拼音字母(现代的拼音字母也有碰撞的风险)并命名测试类:Adam、Baker、Charlie、David、Eddy 等。

看来我们都把注意力集中在了BC>D关系上,而忽略了看得更远的地方。这是军方“目标固定”的程序员调试版本。你陷入了对问题的一个概念之中,无法摆脱。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

核心数据:-deleteObject:崩溃,删除规则是原因吗? 的相关文章

随机推荐

  • 按周分组并选择本周的记录

    我一直在尝试使用 MySQL 显示每周销售结果表 其中一周的结果应如下所示 Sun Mon Tues Wed Thur Fri Sat 所以我继续使用这个查询 SELECT DATE FORMAT cart calendar datefie
  • 如何使用 Java 连接到 Active Directory

    我使用的是Weblogic Ejb3 0 爪哇1 6 我需要通过 Java 代码访问 Active Directory 我读到了几种方法 Kerberos LDAP 有人可以建议我以舒适的方式这样做吗 我在哪里可以有一些完整的代码示例 谢谢
  • 检查 jolt 中是否为 null 或为空,并输入输入 JSON 中存在的另一个值

    这是我的输入 JSON AddressBilling FirstName Some Name LastName Some Name Address some address AddressShipping FirstName LastNam
  • 纯函数式语言中的高效堆

    作为 Haskell 的练习 我正在尝试实现堆排序 在命令式语言中 堆通常被实现为数组 但这在纯函数式语言中效率非常低 因此 我研究了二进制堆 但到目前为止我发现的所有内容都是从命令式的角度描述它们的 并且所提出的算法很难转化为函数设置 如
  • 访问扩展的background.js的控制台和开发工具

    我刚刚开始使用 Google Chrome 扩展 但似乎无法从后台 js 登录到控制台 当发生错误时 例如 由于语法错误 我也找不到任何错误消息 我的清单文件 name My First Extension version 1 0 mani
  • GWT 中的本机 Javascript 方法

    我的 GWT Java 类之一中有一个本机 Javascript 方法 但我在从本机 Javascript 代码调用我的 Java 方法时遇到问题 我试着跟随this http code google com webtoolkit doc
  • 设置多个 geom_sf 图例的格式

    我正在 ggplot 中处理多个 sf 几何图形 并希望以点 线和正方形 对于多边形 的形式显示图例 然而 geom sf 图例结合了我的几何特征 即结合线和点 如下所示 library ggplot2 library sf poly1 l
  • 如何在 PySpark 中过滤 MapType 中的键?

    给定一个如下的 DataFrame 是否可以过滤掉 Column 的一些键收藏PySpark 中的 MapType StringType StringType True 同时保持架构完整 root id string nullable tr
  • Common Lisp 中的属性列表是否引用某些全局状态?

    下面的代码有z作为局部变量 但它的行为就像全局变量一样 defun foo m let z stuff nil push m getf z stuff print z foo 1 foo 2 foo 3 我希望输出是 STUFF 1 STU
  • GLFW 的线程设置

    我开始使用新的 Lwjgl 3 它使用 GLFW 进行显示 鼠标 键盘处理 我真的很喜欢它 然而今天我碰上了砖头 我有一个简单的渲染动画 但是当我拖动屏幕时 它停止渲染 直到我再次放开 According to http www glfw
  • MySQL 视图中的 BLOB 而不是正确的数据

    我使用创建了一个 MySQL 视图UNION ALL从两个表中 这样我就可以为这些表中的相同数据获得相同的列名 即tbl1 author2 AS translator tbl2 translator AS translator 等等 问题是
  • JavaScript 中的字谜查找器

    我应该用 JavaScript 编写一个程序来查找所提供的一系列单词中的所有字谜 例如 monk konm nkom bbc cbb dell ledl llde 输出应分为几行 1 monk konm nkom 2 bbc cbb 3 d
  • java读取远程文件需要用户名和密码

    我正在尝试用java读取远程文件 File f new File 192 168 1 120 home hustler file txt 远程计算机需要用户名和密码才能访问该文件 有没有办法可以通过java代码传递参数并读取文件 packa
  • 启用/禁用时的 JTextField 背景颜色

    当它被禁用时 我将 JTextField 的背景颜色更改为黑色 我这样做是使用UIManager以及我在应用程序启动时设置的这个属性 TextField disabledBackground 我想知道再次启用 JTextField 时如何更
  • 使用带有括号的 my 并且只有一个变量

    我有时会看到这样的 Perl 代码 my variable blah 在单个变量两边加上括号有什么意义 我认为括号仅在声明多个变量时使用 例如 my var1 var2 var3 blah 出现差异时有以下几种情况 When array在右
  • Javadoc 失败,找不到 java.lang.FunctionalInterface 的类文件

    我正在尝试使用 Android Studio 生成 Javadoc 在 Eclipse 下工作正常 但在 Android Studio 下出现错误 javadoc 错误 com sun tools doclets internal tool
  • 计算三级缓存的实际/有效CPI

    a 给定一个具有两级高速缓存 L1 和 L2 的内存系统 以下是规格 L1缓存命中时间 2个时钟周期 一级缓存命中率 92 L2 缓存的未命中惩罚 L2 的命中时间 8 个时钟周期 二级缓存命中率 86 主存丢失惩罚 37 个时钟周期 暂时
  • 带有加载指示器的 UISearchController

    我实施了UISearchController我正在从 js 回调获取数据 但是当我录入searchbar放入数据需要一些时间 所以我想知道如何实现加载indicator进入表查看结果UISearchController 用 Swift 3
  • javascript jquery 单选按钮单击

    我有 2 个单选按钮和 jquery 正在运行
  • 核心数据:-deleteObject:崩溃,删除规则是原因吗?

    我有以下模型 如图所示 替代文本http img521 imageshack us img521 9741 schermata20100224a12251 png http img521 imageshack us img521 9741