有一個應用程序,做同樣的事情,這裏是我的見解。
首先,您應該在編碼之前明智地考慮coredata和多線程。如果你需要幫助,請告訴我。
模型
您在Coredata實體,可以考慮像SQLite中的表,但在一個更抽象的方式。你應該爲review Apple's documentation。
我們可以在您的案例中找到至少三個不同的實體:用戶,對話和消息。 (請注意最後一個,在導入SMS Framework時我遇到了一個名爲Message的實體問題,您應該考慮在實體名稱前加上..)
coredata的一個問題是,您無法直接存儲數組(可能有一些未知類型),但無論如何。所以兩種解決方案來存儲用戶:無論是在時,他們會用逗號和一個簡單的正則表達式或拆分會給你的用戶數量來界定的的NSString ..
所以你的模型可能看起來像:
Conversation{
messages<-->>Message.conversation
lastMessage<-->Message.whateverName
//optional
users<<-->>User.conversation
}
Message{
conversation<<-->Conversation.messages
whatevername<-->Conversation.lastmessage // "whatever as it does not really matter"
}
User{
conversations<<-->>Conversation.users
}
會話必須與消息和消息具有多對多的關係才能與對話建立一對一的關係。
--edit
如果你想顯示就像該消息應用程序(或我的應用程序)的對話的最後消息,您可以添加與消息一一對應關係。它不會在數據庫/ coredata中存儲兩次消息。事實上,你創建一個coredata對象(在這種情況下是一條消息),並將其添加到對話中,內部發生的是對話存儲該對象的coredata ID。爲此消息添加一個關係(lastMessage)將僅存儲另一個ID,而不是另一個對象。
編輯
用戶--end略有不同,因爲它們可以是多個對話(因爲組羣會話)的一部分,這就是爲什麼你需要一個多到許多關係的船。
您可以根據需要添加任意數量的屬性,但這是最低要求!
- 實施
然後在你的代碼,如果你想模仿iMessage的行爲,這裏是我做過什麼:
第一控制器,在那裏你可以看到所有的談話
:使用NSFetchedResultController。查詢應該只關於實體對話。
當單擊一行時,我所做的是新視圖具有會話對象和另一個NSFtechedResultController。然後我只查詢實體消息,但用謂詞指定我只想要這個對話。
如果你想檢查我的應用程序,看流動性,go to this link.
編輯
- 代碼片段找到對話的最後消息
請注意:這在找到一個更好的方法來做它之前(即使用提取的屬性時)是臨時答案
NSFetchRequest * req = [[NSFetchRequest alloc] init];
[req setEntity:[NSEntityDescription entityForName:@"Message" inManagedObjectContext:context]];
[req setPredicate:[NSPredicate predicateWithFormat:@"conversation == %@", self]]; /* did that from a Conversation object.. */
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"sent_date" ascending:NO];
[req setSortDescriptors:[NSArray arrayWithObject:sort]];
[sort release];
NSError * error = nil;
NSArray * messages = [context executeFetchRequest:req error:&error];
[req release];
if ([messages count] > 0) { /* sanity check */
return [messages objectAtIndex:0];
}
return nil;
編輯的--end
希望這有助於!
皮埃爾
我按照你的建議去了,但是在閱讀對話列表時 - 我怎樣才能得到最後一條消息在那裏顯示(就像你在「消息」屏幕中做的那樣)。謝謝。 – 2012-07-20 15:21:33
嗨吉拉德 我稍微編輯了我的答案。 基本上,只需添加一個名爲lastMessage的一對一關係或任何你想要的。 每當您收到新消息/ delete_the_last_one時,只需更新lastMessage字段即可。 如果你不是增加額外關係的粉絲,我可以猜測每次對話都會挖掘NSFetchRequest以查找最後一條消息,但這可能會非常糟糕,性能也很明智。 希望能幫助 – Pierre 2012-07-23 09:57:48
非常感謝皮埃爾 - 這就是我最終做的。刪除郵件時我有一個小問題(我需要手動識別最新郵件並更新我的會話對象),但至少我可以正確地獲取歷史記錄。謝謝!!! – 2012-07-23 23:35:09