Roomデータベースの使用を開始し、ルームエンティティを作成するためにいくつかのドキュメントを調べました。これらは私の関係です。チャットチャネルは多くの会話を持つことができます。したがって、これは1対多の関係になります。したがって、以下のようにエンティティを作成しました。
チャネルエンティティ
@Entity(primaryKeys = ["channelId"])
@TypeConverters(TypeConverters::class)
data class Channel(
@field:SerializedName("channelId")
val channelId: String,
@field:SerializedName("channelName")
val channelName: String,
@field:SerializedName("createdBy")
val creationTs: String,
@field:SerializedName("creationTs")
val createdBy: String,
@field:SerializedName("members")
val members: List<String>,
@field:SerializedName("favMembers")
val favMembers: List<String>
) {
// Does not show up in the response but set in post processing.
var isOneToOneChat: Boolean = false
var isChatBot: Boolean = false
}
会話エンティティ
@Entity(primaryKeys = ["msgId"],
foreignKeys = [
ForeignKey(entity = Channel::class,
parentColumns = arrayOf("channelId"),
childColumns = arrayOf("msgId"),
onUpdate = CASCADE,
onDelete = CASCADE
)
])
@TypeConverters(TypeConverters::class)
data class Conversation(
@field:SerializedName("msgId")
val msgId: String,
@field:SerializedName("employeeID")
val employeeID: String,
@field:SerializedName("channelId")
val channelId: String,
@field:SerializedName("channelName")
val channelName: String,
@field:SerializedName("sender")
val sender: String,
@field:SerializedName("sentAt")
val sentAt: String,
@field:SerializedName("senderName")
val senderName: String,
@field:SerializedName("status")
val status: String,
@field:SerializedName("msgType")
val msgType: String,
@field:SerializedName("type")
val panicType: String?,
@field:SerializedName("message")
val message: List<Message>,
@field:SerializedName("deliveredTo")
val delivered: List<Delivered>?,
@field:SerializedName("readBy")
val read: List<Read>?
) {
data class Message(
@field:SerializedName("txt")
val txt: String,
@field:SerializedName("lang")
val lang: String,
@field:SerializedName("trans")
val trans: String
)
data class Delivered(
@field:SerializedName("employeeID")
val employeeID: String,
@field:SerializedName("date")
val date: String
)
data class Read(
@field:SerializedName("employeeID")
val employeeID: String,
@field:SerializedName("date")
val date: String
)
// Does not show up in the response but set in post processing.
var isHeaderView: Boolean = false
}
ご覧のとおり、会話はチャネルに属しています。ユーザーがチャネルのリストを表示するとき、リストアイテムの最後の会話のいくつかの属性を表示する必要があります。私の質問は、上記のような関係を宣言するだけで十分ですか、またはChannelクラスにConverstionオブジェクトを含める必要がありますか?私がそれを処理できる他の方法は何ですか?UIは、ユーザーがスクロールしたときに、チャネルリストの各アイテムで時間、ステータスなどとともに発生した最新の会話を取得する必要があるためです。したがって、クエリを実行すると、UIに遅れが生じることはありません。
そして、どうすればChannelオブジェクトに最近のConverstaionオブジェクトを含めることができますか?