60

との「多対多」の関係をどのように表現できRoomますか? 私の列名も同じです。

たとえば、私はGuestとを持っていReservationます。Reservationには多数Guestの を含めることができ、aGuestは多数の予約の一部にすることができます。

私のエンティティ定義は次のとおりです。

@Entity data class Reservation(
    @PrimaryKey val id: Long,
    val table: String,
    val guests: List<Guest>
)

@Entity data class Guest(
    @PrimaryKey val id: Long,
    val name: String,
    val email: String
)

ドキュメントを調べているときに@Relation. 私はそれが本当に紛らわしいと思いました。

これによると、POJO を作成し、そこに関係を追加したいと思います。したがって、私の例では、次のことを行いました。

data class ReservationForGuest(
    @Embedded val reservation: Reservation,
    @Relation(
        parentColumn = "reservation.id", 
        entityColumn = "id", 
        entity = Guest::class
    ) val guestList: List<Guest>
)

上記で、コンパイラエラーが発生します:

> Cannot figure out how to read this field from a cursor.

の実用的なサンプルを見つけることができませんでした@Relation

4

6 に答える 6

9

1 回のクエリで M:N ジャンクション テーブルを介して完全なオブジェクト モデルをクエリする方法を次に示します。サブクエリはおそらくこれを行うための最も効率的な方法ではありませんが@Relation、適切にウォークスルーするまでは機能しますForeignKeyゲスト/予約フレームワークを作業コードに手で詰め込んだため、タイプミスがある可能性があります。

エンティティ(これはカバーされています)

@Entity data class Guest(
    @PrimaryKey val id: Long,
    val name: String,
    val email: String
)

@Entity data class Reservation(
    @PrimaryKey val id: Long,
    val table: String
)

@Entity data class ReservationGuest(
    @PrimaryKey(autoGenerate = true) val id: Long,
    val reservationId: Long,
    val guestId: Long
)

Dao (サブクエリを介して M:N を取り込み、余分なReservation行をGROUP_CONCAT

@Query("SELECT *, " +
            "(SELECT GROUP_CONCAT(table) " +
                "FROM ReservationGuest " +
                "JOIN Reservation " +
                "ON Reservation.id = ReservationGuest.reservationId " +
                "WHERE ReservationGuest.guestId = Guest.id) AS tables, " +
        "FROM guest")
abstract LiveData<List<GuestResult>> getGuests();

GuestResult (これはクエリ結果のマッピングを処理します。連結された文字列を でリストに戻すことに注意してください@TypeConverter)

@TypeConverters({ReservationResult.class})
public class GuestResult extends Guest {
    public List<String> tables;

    @TypeConverter
    public List<String> fromGroupConcat(String reservations) {
        return Arrays.asList(reservations.split(","));
    }
}
于 2017-12-31T21:49:38.233 に答える