【问题标题】:NSPredicate problem with fetchedResultsControllerfetchedResultsController 的 NSPredicate 问题
【发布时间】:2010-03-16 21:20:23
【问题描述】:

请帮忙!我一直在努力解决这个问题太久了。

我似乎无法在我的 fetchedResultsController 方法中使用 NSPredicate:

- (NSFetchedResultsController *)fetchedResultsController {    
if (fetchedResultsController != nil) return fetchedResultsController;

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"column == 0"];
[fetchRequest setPredicate:predicate];

[fetchRequest setReturnsObjectsAsFaults:NO];
[fetchRequest setFetchBatchSize:20];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"created_at" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];

return fetchedResultsController; }

然而,在另一种方法中,我只是检查对象是否存在,谓词就像一个魅力:

- (BOOL)findObjectWithKey:(NSString *)key andValue:(NSString *)value sortBy:(NSString *)sort {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"%K == %@", key, value];
[request setPredicate:predicate];

[request setReturnsObjectsAsFaults:NO];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sort ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;

NSError *error = nil;
NSArray *result = [managedObjectContext executeFetchRequest:request error:&error];

[aFetchedResultsController release];
[request release];
[sortDescriptor release];
[sortDescriptors release];

if ((result != nil) && ([result count]) && (error == nil)) {
    return TRUE;
} else {
    return FALSE;
}}

我做错了什么?提前致谢!

【问题讨论】:

  • “column”是核心数据属性的键。

标签: core-data nspredicate


【解决方案1】:

假设您的“column”属性是一个数字,您应该将其与一个 NSNumber 对象进行比较,如下所示:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"column == %@",[NSNumber numberWithInteger:0]];

【讨论】:

  • 并不是说这个特定的谓词不起作用(列谓词)......我似乎根本无法让任何谓词起作用。
  • 如果我按照我的 performFetch 操作: NSLog(@"filteredArrayUsingPredicate = %@", [fetchedResultsController.fetchedObjects filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"column == %@", [NSNumber numberWithInteger:0 ]]]);返回了正确的对象,但这对我没有多大帮助,因为错误的对象(列!= 0)仍在 fetchedResultsController 中。
  • 您是否尝试过创建新数据库?使用我建议的谓词,您的获取结果控制器应该可以工作。
  • 已删除数据库。没有任何工作。我只是不得不走另一条路。感谢您的帮助。
【解决方案2】:

由于列是实体上的一个属性,那么您的谓词逻辑就可以了。您看到哪些结果表明谓词不起作用?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多