iOS上的键值存储数据库

3
一个在iOS上创建键值存储数据库的尝试的例子是YapDatabase

然而,我没有使用过它,并且想了解是否值得使用它,而不是像Core Data或FMDB这样的东西。

我有一个关键的问题:我如何管理这个数据库中的对象关系?

如果我可以避免对象关系,我正在寻找有关如何解决一个对象与另一个对象之间的多对多关系问题的建议或数据库设计技巧。

让我们考虑一个用例(这只是一个示例,以帮助解决此问题):

发送者 <<->> 消息 <<->> 收件人

sender has a: 
    photo_data, 
    name, 
    gender, 
    age, 
    email, 
    username, 
    twitter_id, 
    facebook_id, 
    sender_id

recipient has a: 
    photo_data, 
    name, 
    gender, 
    age, 
    email, 
    username, 
    twitter_id, 
    facebook_id, 
    recipient_id

message has a:
    text, 
    rich_text, 
    picture_data, 
    voice_data, 
    shared_url, 
    message_id

我考虑使用message_id、sender_id和recipient_id来关联每个模型,但是否有更好的方法?
1个回答

6
我已经做过类似的事情,可能不是完全符合要求,但可能会有所帮助。
我为聊天应用程序设置了类似的配置。每个消息都有一个发送者和接收者,但显然当前用户是其中之一。因此,我将所有消息存储在它们自己的集合中,集合的名称是非当前用户的id。
如果使用YapDatabase,则可以使用YapCollectionsDatabase类。
==编辑==
您需要先创建消息和用户类:
@interface Message : NSObject <NSCoding> ...

@property (...) NSString *sender_id;
@property (...) NSString *recipient_id;
@property (...) NSString *user_id; // sender_id || recipient_id (non-current-user)

@property (...) NSDate *timestamp;
...
@end

@interface User : NSObject <NSCoding>

@property (...) NSString *user_id;
...
@end

现在将这些对象存储在数据库中。

我们从YapCollectionsDatabase开始。它是一个集合/键/值存储器。因此,当新消息到达时,我们只需将其存储在适当的集合中。

[dbConnection readWriteWithBlock:^(YapCollectionsDatabaseReadWriteTransaction *transaction){
    [transaction setObject:messsage
                    forKey:uuid
              inCollection:message.user_id
              withMetadata:message.timestamp];
}];

所以每个消息都是单独存储的。但它会与对话中的所有其他消息一起放置在一个集合中。此外,添加新消息很快,因为您只需要向数据库添加一行。
内部,SQLite数据库看起来像这样: |集合|键|对象|元数据|
要查找对话数量或获取对话的用户ID:
[dbConnection readWithBlock:^(YapCollectionsDatabaseReadTransaction *transaction){
    conversationCount = [transaction numberOfCollections];
    conversationUserIds = [transaction allCollections];
}];

要获取对话中的消息数量或消息的id:
[dbConnection readWithBlock:^(YapCollectionsDatabaseReadTransaction *transaction){
    messageCount = [transaction numberOfKeysInCollection:user_id];
    messageIdsSorted = [transaction allKeysOrdered:NSOrderedAscending
                                      inCollection:user_id];
}];

删除数据库中旧的消息:

[dbConnection readWriteWithBlock:^(YapCollectionsDatabaseReadWriteTransaction *transaction){
    [transaction removeObjectsEarlierThan:twoWeeksAgo inCollection:user_id];
}];

希望这能有所帮助。

所以,为了明确起见,我们有一个当前用户的对话字典集合 {"sender_id": messages_array} 和一个非当前用户的对话字典集合 {"recipient_id": messages_array},对吗? - Jesse Armand
我会编辑我的答案并附上一些代码,以帮助消除任何困惑。 - Robbie Hanson
好的,谢谢你提供的代码片段,我需要进行实验。 - Jesse Armand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接