3

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

但是,我没有使用它的经验,并且想了解使用它是否值得,而不是使用 Core Data 或 FMDB 之类的东西。

我遇到的一个关键问题是:如何管理与该数据库的对象关系?

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

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

sender <<->> message <<->> recipient

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和receiver_id来关联每个模型,但有更好的方法吗?

4

1 回答 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 数据库在内部看起来像这样:|collection|key|object|metadata|

要查找对话的数量,或获取对话的用户 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];
}];

希望这可以帮助。

于 2013-03-27T03:32:44.170 回答