2010-12-01 49 views
3

該死的簡短標題! :PCoreData - 從一對多的關係中選擇特定的條目

基本上我有一個名爲「線程」的實體,我有一個名爲「郵件」的實體。我有一個來自線程的一對多關係 - >>消息(以及一對一的反向關係)。

我需要做的是從線程實體中獲取所有記錄,併爲每個需要獲取帶有最新時間戳的消息(這只是「lastUpdated」屬性中的一個int,所以最高數字I猜測就足夠了)。

我不知道,你可能想要什麼其他的信息,這裏是我的實體的截圖:

alt text

我敢肯定,必須有一個更好的辦法不是通過所有的記錄和迭代比較threadIds?

謝謝。

+0

我一直有意在我的應用程序中做這樣的事情,但**不知何故**保持忘記張貼在這裏問。 – BoltClock 2010-12-01 09:59:05

+0

是的,通常情況下我只是比較線程ID,但是這個項目很大程度上依賴於核心數據,所以我認爲我會努力學習如何使它高效並學習關係等方面的一切。儘管如此,無法找到關於核心數據的許多信息。 :( – 2010-12-01 10:02:25

回答

3

一旦你的個人Thread對象,你只需要做的消息的對象排序,並採取最上面的Message對象。

最簡單的解決辦法是在Thread類像這樣來創建一個方法:

- (Messages *) lastUpdatedMessage{ 
    NSSortDescriptor *sort=[NSSortDescriptor sortDescriptorWithKey:@"lastUpdated" ascending:NO]; 
    NSArray *sortedMessages=[self.messagesInThread sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]]; 
    return [sortedMessages objectAtIndex:0]; 
} 

然後,所有你需要做的就是要求其lastUpdatedMessage每個Thread對象。

一個更復雜的,但更有效的解決方案是創建將一個消息對象鏈接到一個線程對象並作爲消息對象更新設置鏈接對象的中間聯的實體。所以:

MessageThreadLink{ 
    message<--(required)-->Message.lastUpdateLink 
    thread<--(required)-->Thread.lastUpdatedMessage 
} 

每當一個Message對象更新時,它會告訴它相關的線程對象,刪除現有的鏈接對象然後再創建一個指向它。您可能會將該代碼放入lastUpdated屬性的自定義設置器中。

使用此方法,您只需要向每個線程詢問其lastUpdatedMessage,並且它會自動顯示,而無需進行大量搜索和排序。

0

你就不能使用NSPredicate對數據進行過濾和屬性,你需要像你一個簡單的數據庫執行查詢值? (或者也許我錯過了點)

+0

我可以做,但接下來最重要的是什麼?!我原以爲會有辦法通過關係訪問實體 – 2010-12-01 10:33:19

+0

我想你是曲解了關係或者我誤解了你:)關係只是一個面向對象的抽象概念模型(如ER/EER)中的_relationship_,因此您可以通過集合(NSSet)和關鍵路徑評估來訪問參與關係的項目。因此,最有效的方法是讓Core Data在給定當前數據模型的情況下使用Predicate獲取所需內容。也許你可以改變數據模型,因爲Rog建議獲得更多的性能 – rano 2010-12-01 10:47:34

0

所以你LASTUPDATED屬性是一個int,而不是NSDate的?如果是這樣,它是否必須是一個int,並且你是否對存儲在該屬性中的數據進行了其他操作?

我在想你可以使用BOOL屬性來標記消息爲lastUpdated == YES,然後你需要做的就是獲取符合該謂詞的消息實體。您仍然可以通過一對一關係訪問線程實體,以便您可以按照自己想要的方式獲取並顯示該數據。作爲一個方面說明,我認爲你可能會發現使用單數詞來命名實體更直觀,因爲每個線程實體包含一個線程,並且每個消息實體包含一條消息。

或選項2

改變你的LASTUPDATED屬性是NSDate的和現在這樣每當實體創建與當前日期/時間,將預填充設置的默認值。

然後爲你保存每個線程,拉動相關消息,由NSDate的對它們進行排序並挑選陣列上的第一個對象,如果ASCENDING ==否,或在最後一個對象如果按升序排序== YES。