- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一段时间以来,我一直遇到 CoreData 的奇怪问题。这将是一个冗长的问题,所以请耐心等待...
我有两个实体,称它们为 A 和 B。B 可能既是多个 A 的创建者又是更新者。 A 必须有一个 B 作为创建者,并且可能有也可能没有 B 作为更新者。 (必需和可选的关系。)
B 可能同时创建和更新了零个或多个 A。
以上是我搭建的数据模型。 (我真的不需要从 B 到 A 的反比关系,但 CoreData 否则会给我编译时警告。)
编辑
以下是 ManagedObject 子类的相关部分:
啊啊
@property (nonatomic, retain) B * creator;
@property (nonatomic, retain) B * updater;
上午
@dynamic creator;
@dynamic updater;
B.h
@property (nonatomic, retain) NSSet * created;
@property (nonatomic, retain) NSSet * updated;
B.m
@dynamic updated;
@dynamic created;
- (void)addUpdatedObject:(A *)value { NSSet *changedObjects = [[NSSet
alloc] initWithObjects:&value count:1]; [self
willChangeValueForKey:@"updated"
withSetMutation:NSKeyValueUnionSetMutation
usingObjects:changedObjects]; [[self
primitiveValueForKey:@"updated"] addObject:value]; [self
didChangeValueForKey:@"updated"
withSetMutation:NSKeyValueUnionSetMutation
usingObjects:changedObjects]; [changedObjects release]; }
- (void)removeUpdatedObject:(A *)value { NSSet *changedObjects =
[[NSSet alloc] initWithObjects:&value count:1]; [self
willChangeValueForKey:@"updated"
withSetMutation:NSKeyValueMinusSetMutation
usingObjects:changedObjects]; [[self
primitiveValueForKey:@"updated"] removeObject:value]; [self
didChangeValueForKey:@"updated"
withSetMutation:NSKeyValueMinusSetMutation
usingObjects:changedObjects]; [changedObjects release]; }
- (void)addUpdated:(NSSet *)value { [self
willChangeValueForKey:@"updated"
withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
[[self primitiveValueForKey:@"updated"] unionSet:value]; [self
didChangeValueForKey:@"updated"
withSetMutation:NSKeyValueUnionSetMutation usingObjects:value]; }
- (void)removeUpdated:(NSSet *)value { [self
willChangeValueForKey:@"updated"
withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
[[self primitiveValueForKey:@"updated"] minusSet:value]; [self
didChangeValueForKey:@"updated"
withSetMutation:NSKeyValueMinusSetMutation usingObjects:value]; }
- (void)addCreatedObject:(A *)value { NSSet *changedObjects = [[NSSet
alloc] initWithObjects:&value count:1]; [self
willChangeValueForKey:@"created"
withSetMutation:NSKeyValueUnionSetMutation
usingObjects:changedObjects]; [[self
primitiveValueForKey:@"created"] addObject:value]; [self
didChangeValueForKey:@"created"
withSetMutation:NSKeyValueUnionSetMutation
usingObjects:changedObjects]; [changedObjects release]; }
- (void)removeCreatedObject:(A *)value { NSSet *changedObjects =
[[NSSet alloc] initWithObjects:&value count:1]; [self
willChangeValueForKey:@"created"
withSetMutation:NSKeyValueMinusSetMutation
usingObjects:changedObjects]; [[self
primitiveValueForKey:@"created"] removeObject:value]; [self
didChangeValueForKey:@"created"
withSetMutation:NSKeyValueMinusSetMutation
usingObjects:changedObjects]; [changedObjects release]; }
- (void)addCreated:(NSSet *)value { [self
willChangeValueForKey:@"created"
withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
[[self primitiveValueForKey:@"created"] unionSet:value]; [self
didChangeValueForKey:@"created"
withSetMutation:NSKeyValueUnionSetMutation usingObjects:value]; }
- (void)removeCreated:(NSSet *)value { [self
willChangeValueForKey:@"created"
withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
[[self primitiveValueForKey:@"created"] minusSet:value]; [self
didChangeValueForKey:@"created"
withSetMutation:NSKeyValueMinusSetMutation usingObjects:value]; }
结束编辑
当我创建一个以 B 作为创建者的新 A 时,一切都很好(使用反向关系时)。但是,当我稍后更新同一个 A 时,使用与创建者相同的 B,我遇到以下崩溃:
2011-05-05 13:17:40.885 myapp[27033:207] -[NSCFNumber count]:
unrecognized selector sent to instance 0x5d14eb0
2011-05-05 13:17:40.887 myapp[27033:207] *** Terminating app due to
uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFNumber
count]: unrecognized selector sent to instance
0x5d14eb0'
*** Call stack at first throw: (
0 CoreFoundation 0x014065a9
__exceptionPreprocess + 185
1 libobjc.A.dylib 0x0155a313 objc_exception_throw + 44
2 CoreFoundation 0x014080bb -[NSObject(NSObject)
doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x01377966 ___forwarding___ + 966
4 CoreFoundation 0x01377522 _CF_forwarding_prep_0 + 50
5 CoreFoundation 0x013b7c3b -[NSSet intersectsSet:] + 59
6 Foundation 0x00c3f4fb NSKeyValueWillChangeBySetMutation +
422
7 Foundation 0x00c0416d NSKeyValueWillChange + 400
8 Foundation 0x00c3f34d
-[NSObject(NSKeyValueObserverNotification)
willChangeValueForKey:withSetMutation:usingObjects:] + 315
9 CoreData 0x01172bd0 -[NSManagedObject
willChangeValueForKey:withSetMutation:usingObjects:] + 112
10 myapp 0x0004fd48 -[B addUpdatedObject:] + 168
11 CoreData 0x011729f2 -[NSManagedObject(_NSInternalMethods)
_includeObject:intoPropertyWithKey:andIndex:] + 98
12 CoreData 0x01169301 -[NSManagedObject(_NSInternalMethods)
_didChangeValue:forRelationship:named:withInverse:] + 497
13 Foundation 0x00c051e4 NSKeyValueNotifyObserver + 361
14 Foundation 0x00c04ca6 NSKeyValueDidChange + 384
15 Foundation 0x00beb3e2
-[NSObject(NSKeyValueObserverNotification)
didChangeValueForKey:] + 123
16 CoreData 0x01166adb
_PF_ManagedObject_DidChangeValueForKeyIndex + 171
17 CoreData 0x01165de9 _sharedIMPL_setvfk_core + 313
18 CoreData 0x01173997 _svfk_11 + 39
(是的,B 定义了方法 addUpdatedObject
。)
对于进一步的背景,A:s 的列表显示在由 NSFetchedResultsController
支持的 UITableView
中。
最奇怪的是,恕我直言,完全有可能添加一个具有相反关系的新 A(以 B 作为创建者)而不会导致崩溃,同时将相同的 B 作为更新程序添加到同一个 A 会导致碰撞。
但是,当我删除反向关系时,一切都按预期进行。
我可以毫无问题地添加与 A:s 的创建者和更新者相同的 B,并且该应用程序正常运行,除了来自 CoreData 的构建时警告:
A.creator should have an inverse
A.updater should have an inverse
那么,是否有任何 CoreData 大师可以解释第一个案例失败的原因?
最佳答案
你不应该能够建立双重关系。 Xcode 3.x 和更早版本甚至不允许您创建具有双重关系的模型(现在用 Xcode 4 检查一下,看起来它会让您在没有警告的情况下这样做。这不是个好主意。)
强烈不建议使用双重关系,因为它们会给图的完整性带来严重的风险,例如删除规则,如果您在一个关系上有 delete
规则,而在另一个关系上有 deny
规则,会发生什么情况?我认为具有双重关系的图只是等待发生的火车残骸。
更重要的是,我从未见过真正需要这种数据模型的情况。通常,更好的数据模型设计将避免对这种危险设置的明显需求。在这种情况下,我认为您需要插入实体来为实际关系本身建模,因为这些关系实际上具有行为或种类:
A{
creator<-->Creation.a
updater<-->Update.a
}
B{
creations<-->>Creation.b
updates<-->>Update.b
}
Creation{
a<-->A.creator
b<-->>B.cretions
}
Update{
a<-->A.updater
b<<-->B.updates
}
这还可以让您通过向 Update
实体添加属性轻松地对更新日期等内容进行建模。
关于objective-c - CoreData 是否允许对象图循环? (奇怪的错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5897447/
我是 PHP 新手。我一直在脚本中使用 for 循环、while 循环、foreach 循环。我想知道 哪个性能更好? 选择循环的标准是什么? 当我们在另一个循环中循环时应该使用哪个? 我一直想知道要
我在高中的编程课上,我的作业是制作一个基本的小计和顶级计算器,但我在一家餐馆工作,所以制作一个只能让你在一种食物中读到。因此,我尝试让它能够接收多种食品并将它们添加到一个价格变量中。抱歉,如果某些代码
这是我正在学习的一本教科书。 var ingredients = ["eggs", "milk", "flour", "sugar", "baking soda", "baking powder",
我正在从字符串中提取数字并将其传递给函数。我想给它加 1,然后返回字符串,同时保留前导零。我可以使用 while 循环来完成此操作,但不能使用 for 循环。 for 循环只是跳过零。 var add
编辑:我已经在程序的输出中进行了编辑。 该程序要求估计给定值 mu。用户给出一个值 mu,同时还提供了四个不等于 1 的不同数字(称为 w、x、y、z)。然后,程序尝试使用 de Jaeger 公式找
我正在编写一个算法,该算法对一个整数数组从末尾到开头执行一个大循环,其中包含一个 if 条件。第一次条件为假时,循环可以终止。 因此,对于 for 循环,如果条件为假,它会继续迭代并进行简单的变量更改
现在我已经习惯了在内存非常有限的情况下进行编程,但我没有答案的一个问题是:哪个内存效率更高;- for(;;) 或 while() ?还是它们可以平等互换?如果有的话,还要对效率问题发表评论! 最佳答
这个问题已经有答案了: How do I compare strings in Java? (23 个回答) 已关闭 8 年前。 我正在尝试创建一个小程序,我可以在其中读取该程序的单词。如果单词有 6
这个问题在这里已经有了答案: python : list index out of range error while iteratively popping elements (12 个答案) 关
我正在尝试向用户请求 4 到 10 之间的整数。如果他们回答超出该范围,它将进入循环。当用户第一次正确输入数字时,它不会中断并继续执行 else 语句。如果用户在 else 语句中正确输入数字,它将正
我尝试创建一个带有嵌套 foreach 循环的列表。第一个循环是循环一些数字,第二个循环是循环日期。我想给一个日期写一个数字。所以还有另一个功能来检查它。但结果是数字多次写入日期。 Out 是这样的:
我想要做的事情是使用循环创建一个数组,然后在另一个类中调用该数组,这不会做,也可能永远不会做。解决这个问题最好的方法是什么?我已经寻找了所有解决方案,但它们无法编译。感谢您的帮助。 import ja
我尝试创建一个带有嵌套 foreach 循环的列表。第一个循环是循环一些数字,第二个循环是循环日期。我想给一个日期写一个数字。所以还有另一个功能来检查它。但结果是数字多次写入日期。 Out 是这样的:
我正在模拟一家快餐店三个多小时。这三个小时分为 18 个间隔,每个间隔 600 秒。每个间隔都会输出有关这 600 秒内发生的情况的统计信息。 我原来的结构是这样的: int i; for (i=0;
这个问题已经有答案了: IE8 for...in enumerator (3 个回答) How do I check if an object has a specific property in J
哪个对性能更好?这可能与其他编程语言不一致,所以如果它们不同,或者如果你能用你对特定语言的知识回答我的问题,请解释。 我将使用 c++ 作为示例,但我想知道它在 java、c 或任何其他主流语言中的工
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我是 C 编程和编写代码的新手,以确定 M 测试用例的质因数分解。如果我一次只扫描一次,该功能本身就可以工作,但是当我尝试执行 M 次时却惨遭失败。 我不知道为什么 scanf() 循环有问题。 in
这个问题已经有答案了: JavaScript by reference vs. by value [duplicate] (4 个回答) 已关闭 3 年前。 我在使用 TSlint 时遇到问题,并且理
我尝试在下面的代码中添加 foreach 或 for 循环,以便为 Charts.js 创建多个数据集。这将允许我在此折线图上创建多条线。 我有一个 PHP 对象,我可以对其进行编码以稍后填充变量,但
我是一名优秀的程序员,十分优秀!