bugfix> android > 投稿

LEFT JOIN を使用した後にオブジェクトにアクセスするにはどうすればいいですか?2つのテーブルに。外部ファイルFile.dbで定義されたテーブルがあり、AndroidのRoomデータベースにロードしています。 2つのテーブルが定義されています。

CREATE TABLE Example (
`id`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`name`  TEXT NOT NULL,
`description`   TEXT,
`source_url`    TEXT
);
CREATE TABLE Example_dates (
`id`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`example_id`    INTEGER NOT NULL,
`color` INTEGER NOT NULL,
`date_from` TEXT,
`date_to`   TEXT,
FOREIGN KEY(`example_id`) REFERENCES `Example`(`id`)
);

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

@Entity(
  tableName = "Example"
)
data class Example constructor(
  @PrimaryKey @ColumnInfo(name = "id") var id: Int,
  @ColumnInfo(name = "name") var name: String,
  @ColumnInfo(name = "description") var description: String?,
  @ColumnInfo(name = "source_url") var sourceUrl: String?
)
@Entity(
  tableName = "Example_dates",
  foreignKeys = arrayOf(
    ForeignKey(entity = Example::class, parentColumns = ["id"], 
     childColumns = ["example_id"]))
)
data class Example_dates constructor(
  @PrimaryKey @ColumnInfo(name = "id") var id: Int,
  @ColumnInfo(name = "example_id") var exampleId: Int,
  @ColumnInfo(name = "color") var color: Int,
  @ColumnInfo(name = "date_from") var dateFrom: String?,
  @ColumnInfo(name = "date_to") var dateTo: String?
)

Daoオブジェクト:

@Dao
interface AnimalDao {
  @Query(
    "SELECT * FROM example_dates LEFT JOIN example ON example_dates.example_id = example.id")
  fun loadAll(): Cursor
}

そして、私はこのようなDBを構築しています:

RoomAsset
  .databaseBuilder(context, AppDatabase::class.java, "File.db")
  .build()

カーソルとは異なる方法でSQLステートメントからマージされたデータを取得する方法はありますか? data class Example にフィールドを追加しようとしました @Ignore アノテーションが付けられたコンストラクターしかし、テーブルの違いでエラーが発生しました-「予想/発見」。または、カーソルに基づくソリューションは正しい実装方法ですか?

ありがとうございました。

回答 1 件
  • わかりました、公式ドキュメントがhttps://developer.android.com/training/data-storage/room/accessing-dataに述べているように

    "It's highly discouraged to work with the Cursor API because it doesn't guarantee whether the rows exist or what values the rows contain."

    だから私は別の data class named ExampleDetail を作成しようとしました  私が必要とするすべてのフィールドと DAO で  オブジェクトカーソルの代わりにリストを返します。

    ありがとうございました。

あなたの答え