有一个应用程序,做同样的事情,这里是我的见解。
首先,您应该在编码之前明智地考虑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