2017-01-19 64 views
0

好的,這是我的問題。我正在通過REST-api同步來自服務器的數據。返回的數據使用JSON,我通過它循環並根據數據採取適當的操作。也就是說,我將它作爲新對象存儲,如果它已經存在則更新該對象,或者如果只存在於本地,則將其刪除。NSPredicate with「NOT IN」condition failed

爲了達到這個目的,當我通過JSON循環時,我從返回的對象中收集ID。這給了我一個所有返回對象的索引。然後查詢我的本地存儲數據,看它是否包含任何應該刪除的對象(換句話說,如果本地ID確實存在或不存在於JSON響應中)。

這是我的問題(抱歉有點冗長的序幕);我使用的NSPredicate只適用於某些場景,哪些場合工作或失敗似乎是隨機的。

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 

    // Array which populates with the IDs from the server 
    NSMutableArray *arrayOfLogIDS = [[NSMutableArray alloc] init]; 

    /* 
    Fetching and parsing JSON ... collecting IDs and adding them to the array. See example below; 
    */ 
    NSArray *logs = [[json valueForKey:@"Logs"] valueForKey:@"Object"]; 

    // Looping through the logs array 
    for (NSArray *log in logs) { 

     [arrayOfLogIDS addObject:[log valueForKey:@"serverID"]]; 

    } 
    // The NSPredicate 
    NSPredicate *serverIDS = [NSPredicate predicateWithFormat:@"NOT (serverID IN %@)", arrayOfLogIDS]; 

    // The array which holds the objects that should be deleted 
    NSArray *logs = [Logs MR_findAllWithPredicate:serverIDS inContext:localContext]; 

}]; 

問題在於NSPredicate不適用於這種特定情況。即使我知道我應該刪除的本地對象,它也不會返回任何結果。 我在應用程序的其他地方使用這種方法,並且它按預期工作。正如你可以看到我在這個應用程序中使用魔法記錄進行核心數據管理。

我覺得我已經完全用完了下一個嘗試,所以任何幫助將不勝感激! :)

+0

你能告訴我你將數據填入arrayOfLogIDS數組的位置嗎? – CodeChanger

+0

我編輯了這個問題,謝謝你看着它! :) – cmeriksson

+0

您使用NOT IN看起來不錯。也許問題在別處。 – danh

回答

0

好吧,事實證明,ID的數組有時有價值存儲爲字符串,有時作爲整數。整數與NSPredicate很好,字符串不那麼多:)解決了!謝謝你的時間。

相關問題