Как получить доступ к объекту, объединенному с SQL, используя Room на Android - PullRequest
0 голосов
/ 25 июня 2018

Я хочу спросить у вас совета, как я могу получить доступ к объекту после использования LEFT JOIN на двух таблицах. У меня есть таблицы, определенные во внешнем файле File.db, и я загружаю их в базу данных Room на Android. У меня определены две таблицы:

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
interface AnimalDao {
  @Query(
    "SELECT * FROM example_dates LEFT JOIN example ON example_dates.example_id = example.id")
  fun loadAll(): Cursor
}

И я строю БД следующим образом:

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

Есть ли способ, как получить объединенные данные из оператора SQL иначе, чем Cursor? Я пытался добавить дополнительные поля в конструктор data class Example с аннотацией @Ignore, но получил ошибку с различиями в таблице - "Ожидается / Найден". Или решение на основе курсора - верный способ реализации?

Спасибо.

1 Ответ

0 голосов
/ 02 июля 2018

Хорошо, как сказано в официальной документации https://developer.android.com/training/data-storage/room/accessing-data

«Настоятельно не рекомендуется работать с API-интерфейсом Cursor, потому что он не гарантирует, существуют ли строки или какие значения содержат строки».

, поэтому я попытался создать еще один data class named ExampleDetail со всеми необходимыми полями, и в DAO объекте я возвращаю List вместо Cursor.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...