1. ホーム
  2. android

[解決済み] ルームデータベースでのブール演算クエリのハードコード

2023-06-16 10:33:38

質問

あるユーザーとマッチする候補のリストを表示するAndroidアプリケーションを作っています。ユーザーは 1 つをクリックしてそのユーザーに「いいね」することができ、私はそれらの「いいね」をすべてローカルに保存します。

このようなマッチングリストを取得するためのクエリを書くことができます。

@Query("SELECT * FROM match WHERE liked = :liked ORDER BY match DESC LIMIT :limit")
fun getMatches(limit: Int = 6, liked: Boolean = true): Flowable<List<Match>>

これでうまくいくことがわかりました。しかし、私はこれまで liked を false に設定するようなシナリオは想定していないので、ブール条件をハードコードする方法があるかどうか知りたいと思っています。私が試した場合。

@Query("SELECT * FROM match WHERE liked = true ORDER BY match DESC LIMIT :limit")

コンパイル時に以下のようなエラーが発生します。

Error:(8, 0) Gradle: error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such column: true)

このブール値をクエリ文字列でハードコードするにはどうしたらよいでしょうか?

私も試してみました。

  • 条件を一重引用符で囲む
    • @Query("SELECT * FROM match WHERE liked = 'true' ORDER BY match DESC LIMIT :limit")

どのように解決するのですか?

SQLite には boolean データ型がありません。Room はそれを INTEGER カラムにマッピングし true1 であり false から 0 .

ということで、これはうまくいくと思います。

@Query("SELECT * FROM match WHERE liked = 1 ORDER BY match DESC LIMIT :limit")

この動作は文書化されていないことを心に留めておいてください。しかし、これは変更すべきではありません - 少なくとも警報が鳴らない限りは - 変更に対処するためにマイグレーションを使用する必要があるからです。