私はこのようなことをしました。これは正確には合わないかもしれませんが、役立つかもしれません。
チャットアプリケーションについても同様の設定がありました。すべてのメッセージには送信者と受信者がいましたが、明らかに現在のユーザーは2人のうちの1人でした。そのため、すべてのメッセージを独自のコレクションに保存しました。コレクションの名前は、非現在のユーザーの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];
}];
したがって、各メッセージは個別に保存されます。ただし、会話内の他のすべてのメッセージとともにコレクションに配置されます。さらに、データベースに1つの行を追加するだけなので、新しいメッセージの追加は高速です。
内部的には、sqliteデータベースは次のようになります。|コレクション|キー|オブジェクト|メタデータ|
会話の数を見つける、または会話のuserIdを取得するには:
[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];
}];
お役に立てれば。