2013-11-13 7 views
10

こんにちは、私はRestKitを0.10.2から0.20.3に更新しました。 Webサービスからオブジェクトが欠落しているときに更新したら、RestKitはローカルストレージからそれらを削除しません。私はそれがRestKit 0.20.xでサポートされていることを知っていますが、私はそれを設定することができません。私はここに示した例に従った。 http://restkit.org/api/latest/Classes/RKManagedObjectRequestOperation.html#overviewRestKitローカルストアから孤立したオブジェクトを削除しない

私はまた、Stackoverflowに関する同様の質問に従った。しかし、まだ答えは受け入れられていません。

は、ここに私のJSON特定のユーザーのすべての家族のメンバーを返します

{ 
    "status": "Success", 
    "member_info": [ 
     { 
      "family_id": "1", 
      "user_id": "1" 
     }, 
     { 
      "family_id": "2", 
      "user_id": "1" 
     }, 
     { 
      "family_id": "3", 
      "user_id": "1" 
     } 
    ] 
} 

です。 Json以上はuser_id = 1です。今、私は、要求がuser_id = 2のために送られた場合、以前の3つのオブジェクトはすべて、ローカルストレージから削除する必要があります。新しいJsonはuser_id = 2です。

{ 
    "status": "Success", 
    "member_info": [ 
     { 
      "family_id": "4", 
      "user_id": "2" 
     }, 
     { 
      "family_id": "5", 
      "user_id": "2" 
     }   
    ] 
} 

これは私がマッピングを作成する方法です。述語で

[objectManager addResponseDescriptorsFromArray:@[                             
                [RKResponseDescriptor responseDescriptorWithMapping:[self connectionsMapping] 
                            method:RKRequestMethodPOST 
                          pathPattern:@"familylist" 
                           keyPath:@"member_info" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]]; 



[objectManager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) { 
     RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"familylist"]; 
     NSDictionary *argsDict = nil; 
     BOOL match = [pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:&argsDict]; 
     if (match) { 
      NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"DBConnections"]; 
      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id == %@", [DBUser currentUser].user_id]; 
      fetchRequest.predicate = predicate; 
      fetchRequest.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"first_name" ascending:YES] ]; 
      return fetchRequest; 
     } 

     return nil; 
    }]; 


- (RKEntityMapping *)connectionsMapping { 
    RKEntityMapping *connectionsMapping = [RKEntityMapping mappingForEntityForName:@"DBConnections" inManagedObjectStore:objectManager.managedObjectStore]; 
    connectionsMapping.setDefaultValueForMissingAttributes = NO; 
    connectionsMapping.identificationAttributes = @[@"family_id"]; 
    [connectionsMapping addAttributeMappingsFromDictionary:@{ 
                  @"family_id": @"family_id", 
                  @"user_id": @"user_id", 
                  }]; 

    return connectionsMapping; 
} 

iはuser_id現在ログインを返す、[DBUser currentUser].user_idを使用しています。そして、ここで、サーバがPOSTリクエストメソッドを期待しているので、私は、私が代わりにgetObjectsAtPathpostObjectを使用していたWebサービス

[[RKObjectManager sharedManager] postObject:nil path:@"familylist" parameters:params 
              success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
NSLog(@"Objects are %@", mappingResult.array); 
}]; 

を呼び出しています。 私は間違っていますか?孤立したオブジェクトを削除するために何か他の処理を行う必要があります。どんな助けもありがとうございます。

+1

'[DBUser currentUser] .user_id'の値をデバッグしましたか?述語は必須ではありません。述語なしで試しましたか? – Wain

+0

ありがとう@Wain、私はあなたを探していた:)、私は述語の値をデバッグして、私は大丈夫だった、私は述語なしで試してみましょう。 – Khawar

+0

述語がなくても前のデータは削除されません。 – Khawar

答えて

11

は最後のステップでRestKitステップをデバッグして問題を解決し、RKManagedObjectRequestOperation.m

if (! [[self.HTTPRequestOperation.request.HTTPMethod uppercaseString] isEqualToString:@"GET"]) { 
     RKLogDebug(@"Skipping deletion of orphaned objects: only performed for GET requests."); 
     return YES; 
    } 

ああにこのコードを発見しました! RestKitは、要求メソッドがPOSTの場合、孤立したオブジェクトを削除しません。私は受け入れるWebサービスを変更しましたGETリクエストも完全に機能しました。 第二に、私はそれが現在のユーザー以外のすべてのオブジェクトを削除するには、間違っていたpredicate

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id == %@", [DBUser currentUser].user_id]; 

を使用していた、私はそうpredicateあなたが欲しいものを意味するものではありません。この

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id != %@", [DBUser currentUser].user_id]; 

のように、NOTオペレータを追加しましたしかし、それはあなたが望まないものです。

+0

3年後にコメントを追加することもできます...述語は、「削除したいもの」または「必要なもの」を意味し、多かれ少なかれ「すべてのオブジェクトが要求で期待される」ことを意味します。結果のオブジェクトはそのセットから差し引かれます。 – netigger

関連する問題