0Pricing
Android Academy · レッスン

クエリとリレーションシップ

データを検索してEntity同士を関連付けます

「クエリとリレーションシップ」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。

単一テーブルの先へ

実際のアプリには関連するデータがあります。たとえば、1人のユーザーが複数の投稿を持ち、1つの注文が複数の商品を持ちます。Roomでは、これらを外部キーと@Relationアノテーションでモデル化します。

パラメーター化されたクエリ

コロンを接頭辞として使うと、@Queryに引数を渡せます。

@Query("SELECT * FROM users WHERE name LIKE :search")
suspend fun search(search: String): List<User>

集計値を返す

クエリは件数などのスカラー値を返せます。

@Query("SELECT COUNT(*) FROM users")
suspend fun count(): Int

外部キーを定義する

子Entityは@ForeignKeyを使って親を参照します。これにより、データベースレベルで参照整合性が保証されます。

@Entity(
    foreignKeys = [ForeignKey(
        entity = User::class,
        parentColumns = ["id"],
        childColumns = ["userId"]
    )]
)
data class Post(
    @PrimaryKey val id: Int,
    val userId: Int,
    val title: String
)

外部キーにインデックスを付ける

Roomでは、クエリのパフォーマンスのために外部キー列へのインデックス作成を推奨しています。@Indexを追加してください。

@Entity(
    indices = [Index("userId")]
)
data class Post(/* ... */ val userId: Int)

onDeleteの動作

親が削除されたときに子をどうするかを決めます。たとえばCASCADEを指定すると、子も削除されます。

ForeignKey(
    entity = User::class,
    parentColumns = ["id"],
    childColumns = ["userId"],
    onDelete = ForeignKey.CASCADE
)

一対多のリレーションをモデル化する

@Embeddedと@Relationを使って、親とその子を組み合わせるクラスを作成します。

data class UserWithPosts(
    @Embedded val user: User,
    @Relation(
        parentColumn = "id",
        entityColumn = "userId"
    )
    val posts: List<Post>
)

リレーションをクエリする

DAOから組み合わせたクラスを返します。Roomが追加のクエリを実行し、オブジェクト同士を結合します。

@Transaction
@Query("SELECT * FROM users")
suspend fun getUsersWithPosts(): List<UserWithPosts>

ここで@Transactionを使う理由

Roomは2つのクエリ(親、次に子)を実行するため、メソッドを@Transactionでラップすると、途中で書き込みが行われない一貫したスナップショットが保証されます。

中間テーブルを使った多対多リレーション

多対多(学生とコースなど)には、中間テーブルと@RelationのassociateByパラメーターを使用します。

@Relation(
    parentColumn = "studentId",
    entityColumn = "courseId",
    associateBy = Junction(Enrollment::class)
)
val courses: List<Course>

リレーションのまとめ

  • @ForeignKeyは整合性とカスケードルールを適用します。
  • @Relationと@Embeddedで関連するオブジェクトを組み立てます。
  • @Transactionにより、複数クエリによる読み取りの一貫性が保たれます。

理解度チェック

リレーションについての理解度を確認しましょう。

まとめ

学習した内容:

  • :nameでクエリをパラメーター化し、集計結果を返す方法。
  • @ForeignKeyでonDeleteルールに基づいて整合性を適用する方法。
  • @Relationと@Embeddedで関連オブジェクトを構築し、読み取りを@Transactionでラップする方法。

よくある質問

「クエリとリレーションシップ」レッスンは無料ですか?

はい。「クエリとリレーションシップ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。

「クエリとリレーションシップ」で何を学びますか?

データを検索してEntity同士を関連付けます ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「クエリとリレーションシップ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. EntityとDAO
  2. Room Databaseクラス
  3. クエリとリレーションシップ
  4. Flowでデータを監視する
← Android Academyに戻る