【发布时间】: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,但似乎我的课程是正确的。
【问题讨论】:
标签: ios core-data magicalrecord