iOS上的键值存储数据库

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

但是,我没有经验,并想知道是否值得使用它,而不是像核心数据或FMDB的东西。

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

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

我们来考虑一个用例(这只是一个例子,来帮助解决这个问题):

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

我做了这样的事情,这可能不是一个确切的结果,但可能有帮助。

我有一个类似的聊天应用程序的设置。 每封邮件都有一个发件人和收件人,但显然当前用户是其中的一个。 所以我把所有的消息都存储在自己的集合中,集合的名字就是非当前用户的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 |

要查找对话的数量,或者获取对话的userIds:

 [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]; }]; 

希望这可以帮助。