2010-06-11 25 views
0

我还没有在这里看到任何其他问题,但我希望有人有一些洞察力。我刚开始学习Core Data。如何确定表是否包含任何具有核心数据的记录?

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

迄今为止发现的最好方法是将fetchLimit设置为1,然后检查是否有任何内容返回。

[request setFetchLimit:1]; 

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

谢谢!

+0

你问你如何检查使用核心数据的提取请求是否返回任何记录? – 2010-06-11 22:36:02

+0

一些建议。不要将实体看作表格。他们不是。他们是对象。核心数据不是SQL,试图将它塞进SQL语句会导致悲伤。 – TechZen 2010-06-12 21:12:58

回答

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; 

} 
+0

+1好抓。那是很少使用和人们忘记的方法之一。 – TechZen 2010-06-12 21:11:44

+0

那么这个方法比请求它返回第一个联系人更快吗? – Brad 2010-06-12 21:15:39

+1

是的,做一个计数总是会比提取更快(假设两者都是相同的谓词)。 – 2010-06-12 21:40:11

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,在饲料读者说明了这一点应用程序。 Marcus是核心数据大师。

+0

我没有任何特定的记录来搜索,因为它可能会有所不同。 – Brad 2010-06-11 19:54:50

+0

在查看你的答案时,它实际上会帮助我解决另一部分代码,即使它不能解决我原来的问题。如果没有其他人对我原来的问题有更好的回答,我会提出你的答案并接受它。谢谢!! – Brad 2010-06-11 19:56:47

相关问题