Как создать вычисляемые столбцы в базе данных Room (Android)? - PullRequest
0 голосов
/ 11 марта 2020

У меня есть объект с именем Note, который выглядит следующим образом:

@Entity(tableName = "notes")
@TypeConverters(DateConverter::class)
data class Note(
    @ColumnInfo(name = "note_title") var title: String,
    @ColumnInfo(name = "note_description") var description: String,
    @ColumnInfo(name = "note_color") var color: String,
    @ColumnInfo(name = "note_isDeleted") var isDeleted: Boolean,
    @ColumnInfo(name = "note_isPrivate") var isPrivate: Boolean
) {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "note_id")
    var id: Long = 0

    var labels: List<Label> = ArrayList<Label>()

    @ColumnInfo(name = "note_creationDate")
    var creationDate: Date = Date()

    @ColumnInfo(name = "note_modificationDate")
    var modificationDate: Date = Date()
}

И объект с именем Label:

@Entity(tableName = "labels")
class Label (
    @ColumnInfo(name = "label_name") var name: String
){
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "label_id")
    var id: Long = 0
}

Эти два объекта имеют много -много отношения, поэтому у меня есть сущность crossRef:

@Entity(tableName = "noteLabelCrossRef", primaryKeys = ["note_id", "label_id"], indices = [Index(value = ["label_id"])])
class NoteLabelCrossRef (
    @ColumnInfo(name = "note_id") var noteId: Long,
    @ColumnInfo(name = "label_id") var labelId: Long
)

, и это результат запроса, если я хочу получить метки заметки:

class NoteWithLabels {
    @Embedded
    var note: Note? = null

    @Relation(
        parentColumn = "note_id",
        entityColumn = "label_id",
        associateBy = Junction(NoteLabelCrossRef::class)
    )
    var labels: List<Label>? = null
}

Внутри моего DAO У меня есть метод, который возвращает список заметок:

@Query("SELECT * FROM notes WHERE notes.note_isDeleted = 0 AND notes.note_isPrivate = 0 ORDER BY note_creationDate DESC")
fun getNormal(): LiveData<List<Note>>

Дело в том, что я хочу, чтобы каждый note заполнил свой столбец labels списком меток (если он имеет any) from NoteWithLabels.

Но я хочу сделать это только с одним запросом, поэтому все, что мне нужно сделать, это позвонить по номеру dao.getNormal(), и заметки будут также запрашиваться с их метками.

Я читал о вычисленных / сгенерированных столбцах в SQLite, но не смог найти решение для моей проблемы

...