我的模型中有两种类型的对象 - 比方说Kid
和Parent
。我通过JSON中的iOS应用程序从服务器获取它们,如下所示:
{
"kids": [
{
"id": 1,
"parents": [
{
"id": 1
}
]
},
{
"id": 2,
"parents": [
{
"id": 1
},
{
"id": 2
}
]
}
]
}
如您所见,Kid
与To-Many
对象有Parent
关系。我正在使用魔法记录存储日期,我在核心数据模型中有这种关系,以便能够获得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
个属性。我简化了代码以提高可读性,两个对象中都有很多其他属性,并且所有属性都是零。
为什么会这样?我在保存方面做错了吗?我找到了this question,但似乎我的课程是正确的。
答案 0 :(得分:0)
首先,我不认为这段代码实际上做了什么......
// clearing current relationship
NSSet *kidParents = [kid.kidParents copy];
for (Parent *parent in kidParents)
{
[kid parent];
}
如果你想要清除这些关系,你可以将这个关系弄到一边,一切都将被断开。但是,除非您明确删除数据,否则不会删除数据。寻找-MR_deleteEntity
方法来帮助您。
其次,在使用一对多关系时,我更喜欢使用parent.kid = kid
语法,而不是[kid addParentsObject:parent]
。它使事情更容易阅读。
第三,没有必要在updateFromDictionary方法中创建数据字典的mutableCopy。
第四,实际问题可能是您没有将正确的字典子集传递给updateFromDictionary方法。看起来您只是传入顶级字典而不是父母特定信息。您可以告诉这一点,因为您仍然获得非零对象,但没有数据。 if-check on data是一个赠品,数据不包含在传入的字典中。
另外,我会提到MagicalRecord已经为您编写了导入代码。您需要做的就是将源数据映射到CoreData模型。这些映射(当前)驻留在用户信息字典中的实体模型文件(可视实体编辑器)中。我建议看看(简短)instructions I wrote on CocoaismyGirlfriend.com。