我需要一些关于这个方法的帮助:
// deletes all points in database except points with given identifiers
- (void)deleteAllPointsExcept:(NSArray *)safeIdentifiers save:(BOOL)save {
// create request to fetch all 'doomed' points
NSManagedObjectContext *context = [[TSAppDelegate delegate] managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MapPoint"];
NSMutableArray *subpredicates = [NSMutableArray array];
for (NSNumber *identifier in safeIdentifiers) {
NSPredicate *pred = [NSPredicate predicateWithFormat:@"pid!=%@", identifier];
[subpredicates addObject:pred];
}
fetchRequest.predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates];
// fetch 'em & destroy 'em
NSError *error;
NSArray *points = [context executeFetchRequest:fetchRequest error:&error];
for (TSMapPoint *point in points) {
[context deleteObject:point];
}
// save if requested
if (save) {
[[[TSAppDelegate delegate] managedObjectContext] save:NULL];
}
}
它应该从我的核心数据NSManagedObjectContext
中清除不需要的MapPoints。它运行良好,但有一天我收到了这样的消息:
CoreData: error: (1) I/O error for database at ... SQLite error code:1, 'Expression tree is too large (maximum depth 1000)'
我在谷歌上搜索过,当谓词像WHERE id=1 OR id=2 OR id=3 ...
一样太长时会发生这种情况,但我不知道如何解决这个问题。有人有主意吗?
提前感谢,皮特。
您的谓词应该简化为如下
[NSPredicate predicateWithFormat:@"NOT (pid IN %@)", safeIdentifiers];
如果标识符太多,就不能在SQL命令中直接使用它们(无论是否使用参数)。
您必须将所有ID写入一个临时表,然后使用一个谓词来检查该表:
DELETE FROM PointsTable WHERE pid NOT IN MyTempTable