Magical Record 关系返回空对象
Posted
技术标签:
【中文标题】Magical Record 关系返回空对象【英文标题】:Magical Record relationship return empty objects 【发布时间】:2014-08-01 09:37:54 【问题描述】:我的模型中有两种类型的对象——比如说Kid
和Parent
。我以 JSON 格式从 ios 应用程序中的服务器获取它们,如下所示:
"kids": [
"id": 1,
"parents": [
"id": 1
]
,
"id": 2,
"parents": [
"id": 1
,
"id": 2
]
]
如您所见,Kid
与 Parent
对象有一个 To-Many
关系。我正在使用 Magical Record 来存储日期,并且我在 Core Data Model 中有这种关系,以便能够获取 kid.parents
对象。
从服务器获取它们时,我使用的是以下代码:
for (NSDictionary *kidDict in objects)
NSNumber *oid = kidDict[@"id"]; // i'm using 'oid' in Obj-C when there is a need to use 'id' keyword
Kid *kid = [Kid MR_findFirstByAttribute:@"oid" withValue:oid];
if (kid == nil)
kid = [Kid MR_createEntity];
[kid updateFromDictionary:kidDict];
[self updateParentsFromArray:kidDict[@"parents"] forKid:kid];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
// ...
+ (void)updateParentsFromArray:(NSArray *)parents forKid:(Kid *)kid
// clearing current relationship
NSSet *kidParents = [kid.kidParents copy];
for (Parent *parent in kidParents)
[kid removeParentsObject:parent];
for (NSDictionary *parentDict in *parents)
NSNumber *oid = parentDict[@"id"];
Parent *parent = [Parent MR_findFirstByAttribute:@"oid" withValue:oid];
if (!parent)
parent = [Parent MR_createEntity];
[parent updateFromDictionary:parentDict]; // updating current object to catch all server changes for it
[kid addParentsObject:parent];
// Kid and Parent updating method
- (void)updateFromDictionary:(NSDictionary *)dictionary;
NSMutableDictionary *dict = [dictionary mutableCopy];
if (dict[@"id"]) self.oid = dict[@"oid"];
但是,当我想获得 kid.parents
时,它会返回一个空对象数组。因此,对于第一个孩子,它返回一个 Parent
和 oid == nil
,对于第二个孩子,它返回两个 Parent
,都带有 nil
属性。为了更好的可读性,我简化了代码,两个对象中还有很多其他属性,而且都是 nil。
为什么会这样?我在储蓄方面做错了吗?我找到了this question,但似乎我的课程是正确的。
【问题讨论】:
【参考方案1】:首先,我认为这段代码实际上并没有做任何事情......
// clearing current relationship
NSSet *kidParents = [kid.kidParents copy];
for (Parent *parent in kidParents)
[kid parent];
如果你想清除关系,你可以只 nil to many side,一切都会断开。但是,除非您明确删除数据,否则不会删除数据。寻找-MR_deleteEntity
方法来帮助您。
其次,在使用一对多关系时,我更喜欢使用parent.kid = kid
语法,而不是[kid addParentsObject:parent]
。它使事情更容易阅读。
第三,无需在 updateFromDictionary 方法中创建数据字典的 mutableCopy。
第四,实际问题可能是您没有将正确的字典子集传递给 updateFromDictionary 方法。看起来您只是在传递***字典而不是父级特定信息。你可以告诉这一点,因为你仍然得到非零对象,但没有数据。对数据的 if-check 表明数据不包含在传入的字典中。
在旁注中,我会提到 MagicalRecord 已经为您编写了导入代码。您需要做的就是将源数据映射到 CoreData 模型。这些映射(当前)驻留在用户信息字典中的实体模型文件(可视实体编辑器)中。我建议看一下(简短的)instructions I wrote on CocoaismyGirlfriend.com。
【讨论】:
[kid parent]
显然是我的错误,应该是[kid removeParentsObject...]
,已编辑。谢谢你的第二个说明,我会考虑的。第三个-我应该删除有问题的这一行-在实际代码中,我删除了那里的所有 NSNull 对象。没必要,因为我会按照您的建议查看 MagicalRecord 映射。嗯,我会检查我是否通过了正确的字典,但我相信它们也是正确的。感谢您的建议以上是关于Magical Record 关系返回空对象的主要内容,如果未能解决你的问题,请参考以下文章