2010-06-11 28 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

相關問題