核心数据:表达式树太大



我需要一些关于这个方法的帮助:

// 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

最新更新