0

例: 学生と大学がいます:

student {
  id,
  name,
  university
}



university {
      id,
      name
}

次に、RestKit を使用してモデル化する必要があるサーバーからの応答として、次の json-object を検討します。

{
  "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 のバグだと思います。最初にオブジェクトを作成すると思います: bob と anton だけでなく、大学用の 2 つのオブジェクトも作成します。次に、これらのオブジェクトをリンクしますが、2 つの大学オブジェクトが作成されたため、うまくいきません。

更新: 私の理論は間違っていました。オブジェクトが作成されたときに出力を wekit-API に追加しました。

私の間違い: JSON SYNTAX に従って関係の複数属性を設定しませんでした。RESTKIT は正常に動作しますが、この問題を防ぐために、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 に答える