2012-01-17 62 views
2

這裏是我的數據模型的例子:核心數據:如何在一個特定的屬性值的一一對多的關係算實體?

  • 有郵箱
  • 每個郵箱有許多消息
  • 每條信息都有一個標誌,表示如果是讀

我怎樣才能算上未讀郵件的數量爲特定郵箱

我試圖創建在數據模型編輯器讀取請求時,但我不能爲郵箱添加條件雖然消息實體具有用於其擁有郵箱限定的關係。

我知道我不應該與核心數據打交道時,覺得在SQL,但感覺那麼自然這麼說:

SELECT count(*) FROM Messages WHERE unread = 1 AND mailboxId = 12345 

是否有另一種方式來獲得的未讀郵件數等不是通過循環每個郵件的特定郵箱?

回答

5

你想不獲取的對象來算,因爲這將需要更長的時間:

- (NSUInteger)countForFetchRequest:(NSFetchRequest *)request error:(NSError **)error 

返回對象給定的獲取,如果它已經傳遞給executeFetchRequest要求將返回的數量:錯誤:

你還需要一個謂詞添加到您的取得請求(即WHERE子句)。

NSFetchRequest * request = [[NSFetchRequest alloc] init]; 
[request setEntity: [NSEntityDescription entityForName:@"Messages" inManagedObjectContext:context]]; 
[request setPredicate:[NSPredicate predicateWithFormat: @"(unread == 1 && mailboxId == %i)", mailboxId]]; 

(我可以有我的謂詞語法錯誤....但你應該明白我的意思)

+0

感謝您的超快速響應。按照您的建議使用謂詞。這是事實,我不能設置在數據模型編輯器的讀取請求,那麼只有一個限制的關係狀態? – Mark 2012-01-17 12:25:55

+1

可以使用鍵路徑的謂詞設置的關係條件,所以mailbox.id將工作(如@Ashley米爾斯對他的回答提出的建議)。 – bandejapaisa 2012-01-17 12:52:14

0

下面的代碼將計算未讀Messages,有unread == YES和(假設mailbox關係),其中郵箱的id == 12345

NSFetchRequest * request = [[[NSFetchRequest alloc] init] autorelease]; 
request.entity = [NSEntityDescription entityForName: @"Messages" inManagedObjectContext: context]; 

request.predicate = [NSPredicate predicateWithFormat: @"(%K == %@) && (%K == %@)", 
            @"unread", [NSNUmber numberWithBool: YES], 
            @"mailbox.id", @"12345"]; 

NSError * error = nil; 
int count = [[self managedObjectContext] countForFetchRequest: request error: &error]; 

(注:我喜歡用%K作爲關鍵路徑的佔位符,因爲我宣佈爲屬性名字符串常量)

-1

下面的代碼做所需的任務:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MessageEntity" 
                 inManagedObjectContext:appDelegate.managedObjectContext]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(unread == %i)", 1]; 
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
[fetchRequest setPredicate:predicate]; 
[fetchRequest setEntity:entity]; 

NSArray *allResults = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:nil]; 

NSMutableArray *filteredSet = [[NSMutableArray alloc] init]; 
for(yourMailboxEntityObject *aMailBox in allResults) { 
    if(aMailbox.mailboxId == your_desired_id) 
     [filteredSet addObject:aMailBox]; 
} 

//do your code 
NSLog(@"unreaded messages: %d", [filteredSet count]); 

//be sure to release the filteredSet... 
[filteredSet release]; 
+0

錯誤的答案。 @Mark需要一些消息。你的回答需要返回對象,然後再進一步過濾集合,然後對它們進行計數。讓數據庫完成這項工作並使用countForFetchRequest: – 2012-01-17 12:35:11

相關問題