模型关系而不覆盖非映射属性?

时间:2013-01-05 02:17:44

标签: objective-c ios restkit

示例: 我们有学生和大学:

student {
  id,
  name,
  university
}



university {
      id,
      name
}

现在考虑将以下json-object作为服务器的响应,应使用RestKit建模:

{
  "students": [{
    "id" : 1,
    "name" : "bob",
    "university":{
        "id" : 1,
        "name" = "blub-university" } 
  },
  {
    "id" : 2,
    "name" : "anton",
    "university":{ 
          "id" : 1 }
  }
  ]
}

由于anton已经知道大学id = 1的内容,所以只传递了id。

我的问题: 我在RestKit中使用了学生和大学之间的关系,但是 Restkit在处理响应时会覆盖大学对象。处理此类响应的正确方法是什么?

我认为这是Restkit中的一个Bug。我认为它首先创建了对象:bob和anton,还有大学的两个对象。 然后它链接这些对象,但这不起作用,因为它创建了两个大学对象!

更新: 我的理论错了,我在创建对象时向weskit-API添加了输出。

我的错误: 我没有根据JSON SYNTAX设置关系的多重属性。 RESTKIT工作很精细,但也许休息套件中的一些断言可以,以防止这个问题: - )。

1 个答案:

答案 0 :(得分:0)

假设这是您收到的回复,并且您保证在没有回复之前让大学的名称返回,我会像这样处理它。

(半伪代码)

for(NSDictionary *dict in JSON){
    Student *stu = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context];
    [stu set_Id:[dict objectForId:@"id"]];
    [stu set_Name:[dict objectForId:@"name"]];
    NSDictionary *uniDictionary = [dict objectForId:@"university"];
    University *uni = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context];
    [uni set_Id:[uniDictionary objectId:@"id"]];
    if (uniDictionary objectForKey:@"name"] != nil) {
        [uni set_Id:[uniDictionary objectId:@"name"]];
    }
    else {
        NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"University"];
        fetchRequest.predicate = [NSPredicate predicateWithFormat:@"id == %d", [uniDictionary objectId:@"id"]];
        NSError *error;
        NSArray *arr = [context executeFetchRequest:fetchRequest error:&error];
        University *uniWithName = arr[0];
        [uni set_Name:uniWithName.name];
    }
}

if-else将起作用,因为具有名称的大学将在上下文中并且可以轻松获取。