0

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

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 }
  }
  ]
}

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

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

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

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

我的错误:我没有根据 JSON 语法设置关系的复数属性。RESTKIT 工作得很好,但也许休息套件中的一些断言会很好,以防止这个问题:-)。

4

1 回答 1

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 将起作用,因为具有该名称的大学将在上下文中并且可以轻松获取。

于 2013-01-05T07:39:03.390 回答