NSPredicate与" NOT IN"条件失败

时间:2017-01-19 13:06:57

标签: objective-c core-data nspredicate magicalrecord

好的,这是我的问题。我正在通过REST-api同步服务器中的数据。返回的数据是JSON,我遍历它并根据数据采取适当的操作。也就是说,我将其存储为新对象,如果对象已经存在则更新该对象,如果仅存在于本地,则将其删除。

为了实现这一点,我在循环访问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在这种特定情况下不会工作。即使我知道我在本地有应该删除的对象,它也不会返回任何结果。 我在应用程序的其他地方使用此方法,它按预期工作。如您所见,我在此应用程序中使用Magical Record进行核心数据管理。

我觉得我已经完全耗尽了下一步的事情,所以任何帮助都会非常感激! :)

1 个答案:

答案 0 :(得分:0)

好的,事实证明,ID数组有时会将值存储为字符串,有时也会存储为整数。整数与NSPredicate运行良好,字符串不是很多:)解决了!谢谢大家的时间。