2017-01-19 66 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很好,字符串不那么多:)解决了!谢谢你的时间。

相关问题