Присоединение строки встроенного объекта к POJO в Room Dao - PullRequest
0 голосов
/ 29 декабря 2018

Я запрашиваю POJO, используя Room Persistance Library (v2.0.0).У меня есть все эти объекты в разных таблицах (книги, категории, ...).Я пытаюсь объединить BookEntryEntity с категорией, которая соответствует BookEntry category_id.

class BookEntry(
        @Embedded var entity: BookEntryEntity = BookEntryEntity(),
        @Embedded(prefix = 'cg_') var category: Category? = null,
        contacts: List<Contact.ContactEntity>? = null
) : Parcelable {

    @Relation(
            entity = Contact.ContactEntity::class,
            parentColumn = 'id',
            entityColumn = 'bookentry_id'
    )
    var embeddedContacts: List<Contact.ContactEntity>? = contacts

    //...

    @Entity(tableName = 'bookentries')
    data class BookEntryEntity(
            @PrimaryKey(autoGenerate = true) @ColumnInfo(name = 'id') var id: Long = 0,
            @ColumnInfo(name = 'title') var title: String = "",
            @ColumnInfo(name = 'date') var date: Date = Date(),
            @ColumnInfo(name = 'value') var value: Double = 0.0,
            @ColumnInfo(name = 'notes') var notes: String = "",
            @ColumnInfo(name = 'entrytype') var entryType: Int = Type.Earning,
            @ColumnInfo(name = Reference.CATEGORY_ID) var categoryId: Long? = null
    )

}

Встроенный объект Category не присоединяется автоматически.

@Entity(tableName = 'categories')
data class Category(@PrimaryKey(autoGenerate = true) @ColumnInfo(name = 'id') val id: Long = 0, @ColumnInfo(name = 'name') var name: String = "")

Я попытался присоединиться к нему следующим образом:

@Dao
interface BookEntryDao {

    @Transaction
    @Query("SELECT * FROM bookentries INNER JOIN categories ON bookentries.cg_id = categories.id WHERE categories.id == bookentries.category_id ORDER BY bookentries.date DESC")
    fun getBookEntries(): LiveData<List<BookEntry>>
}

К сожалению, яполучаю ошибку:

ошибка: проблема с запросом: [SQLITE_ERROR] Ошибка SQL или отсутствует база данных (такой столбец отсутствует: bookentries.cg_id)

Но если я удаляю внутреннее соединение, я получаю следующее предупреждение:

предупреждение: at.guger.moneybook.data.model.BookEntry имеет некоторые поля [cg_id, cg_name], которые не возвращаютсязапрос.

Как правильно присоединить запрос?

1 Ответ

0 голосов
/ 29 декабря 2018

Попробуйте:

@Dao
interface BookEntryDao {

    @Transaction
    @Query("SELECT * FROM bookentries INNER JOIN categories ON bookentries.category_id = categories.id ORDER BY bookentries.date DESC")
    fun getBookEntries(): LiveData<List<BookEntry>>
}
...