使用谓词时,NSFetchedResultsController`使用和不使用save来获取数据更改

时间:2015-01-25 17:07:46

标签: objective-c core-data nsfetchedresultscontroller

使用谓词时,

NSFetchedResultsCotroller表现得很奇怪。以下代码打印输出:

Rows - 0

但是当我注释掉[self saveContext](第一个)时,输出变为:

Rows - 1

删除谓词(query.predicate)修复了事情,输出始终是:

Rows - 1

我怀疑它与内存与数据库查询中NULL的比较方式有关。知道实际发生了什么吗?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    NSError *error;

    // Deletes persistent store coordinator behind the scene

    // Create an empty entity with the optional fields attr1 (string) and attr2 (date)
    Entity *e = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:[self managedObjectContext]];
    [self saveContext]; // <---------------- Code to comment out

    // Setup fetched results controller
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(attr1 != %@) AND (attr2 != %@)", @"", [NSDate new], nil];

    NSFetchRequest *query = [[NSFetchRequest alloc] initWithEntityName:@"Entity"];
    query.predicate = pred;
    query.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"attr1" ascending:NO]];

    frc = [[NSFetchedResultsController alloc] initWithFetchRequest:query managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    frc.delegate = self;
    [frc performFetch:&error];

    // Output #1
    NSLog(@"Rows - %ld", frc.fetchedObjects.count);

    [self saveContext];

    return YES;
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    NSLog(@"Rows - %ld (Update)", controller.fetchedObjects.count);
}

修改

修改谓词似乎解决了这个问题。仍然不知道为什么:

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"((attr1 = NULL) OR (attr1 != %@)) AND ((attr2 = NULL) OR (attr2 != %@))", @"", date];

1 个答案:

答案 0 :(得分:0)

是的,我怀疑它与您的谓词有关。我认为nil作为替换对象的行为是不可预测的。您可以在格式字符串本身中使用NULLnil,也可以在表示null的真实对象中使用[NSNull null]。如果你试试这个,也许你的原始谓词也会起作用。

但还有其他事情要发生。也许你的实体有一些默认值使谓词失败,这可以解释为什么在某些情况下保存可以改变获取结果。此外,尚不清楚saveContext方法的内容是什么。

此外,并非[NSDate new]生成的日期精确到1/10000秒,因此谓词的这一部分应始终返回true