具有 "NOT IN" 条件的 NSPredicate 失败
NSPredicate with "NOT IN" condition fails
好的,这是我的问题。我正在通过 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 不适用于这种特定情况。它 returns 没有结果,即使我知道我在本地有应该删除的对象。
我在应用程序的其他地方使用了这种方法,它按预期工作。如您所见,我在此应用程序中使用 Magical Record 进行核心数据管理。
我觉得我完全 运行 没有下一步可以尝试的东西了,所以任何帮助将不胜感激! :)
好的,事实证明,ID 数组有时将值存储为字符串,有时存储为整数。整数与 NSPredicate 配合得很好,字符串则不太适用:) 已解决!感谢大家抽出宝贵时间。
好的,这是我的问题。我正在通过 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 不适用于这种特定情况。它 returns 没有结果,即使我知道我在本地有应该删除的对象。 我在应用程序的其他地方使用了这种方法,它按预期工作。如您所见,我在此应用程序中使用 Magical Record 进行核心数据管理。
我觉得我完全 运行 没有下一步可以尝试的东西了,所以任何帮助将不胜感激! :)
好的,事实证明,ID 数组有时将值存储为字符串,有时存储为整数。整数与 NSPredicate 配合得很好,字符串则不太适用:) 已解决!感谢大家抽出宝贵时间。