如何确定表是否包含具有核心数据的任何记录?

时间:2010-06-11 18:17:23

标签: iphone cocoa-touch core-data

我在这里没有看到任何其他类似的问题,但我希望有人有一些见解。我刚刚开始学习核心数据。

基本上,我有两种方法,我想根据“Contacts”表是否包含任何记录来选择使用if / else语句调用哪一种方法。 是否有办法使用核心数据来检查表中是否有任何记录?

到目前为止,我发现的最好的方法是将fetchLimit设置为1,然后检查是否有任何返回。

[request setFetchLimit:1];

但我一直认为必须有更好/更简单的方法。任何人都知道或有一个很好的参考我可以看看?

非常感谢!

2 个答案:

答案 0 :(得分:4)

是的,绝对有更好的方法。像往常一样设置一个获取请求,但是,如果它已经传递给executeFetchRequest:error:

,只需询问它将返回的对象数量,而不是实际执行它。

这可以使用

完成
- (NSUInteger)countForFetchRequest:(NSFetchRequest *)request error:(NSError **)error;

这样的事情:

- (int) numberOfContacts{

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSManagedObjectContext *managedObjectContext = yourManagedObjectContext;
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contacts" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];

    NSError *error = nil;
    NSUInteger count = [managedObjectContext countForFetchRequest:request error:&error];
    [request release];

    if (!error){
        return count;
    }
    else
        return -1;

}

答案 1 :(得分:2)

它不一定更好或更容易,但您可以查找特定记录,然后创建它,如果它不存在这样:

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

NSError *error;
// Filter based on a predicate
[fetchRequest setPredicate:
                [NSPredicate predicateWithFormat:@"identifier == %@", @"1"]];
NSManagedObject *contact = [[managedObjectContext 
                   executeFetchRequest:fetchRequest error:&error] lastObject];

// If the contact was not found
if (!contact)
{
  // Create the contact
  contact = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" 
                                  inManagedObjectContext:managedObjectContext];
  [contact setValue:[NSNumber numberWithInt:1] forKey:@"identifier"];
  [managedObjectContext save:nil];
}

Marcus Zarra发布了some code,在Feed阅读器应用中展示了这一点。 Marcus是核心数据大师。