Как сохранить сущность, связанную с несколькими сущностями в комнате Android? - PullRequest
0 голосов
/ 23 января 2020

У меня есть 3 объекта. КНИГА , ПОЛЬЗОВАТЕЛЬ и НАБЛЮДЕНИЕ .

Это КНИГА . Всего данных

data class Book(
    val id: Int,
    val title: String,
    val author: String,
    val pages: Int?,
    val editorial: String?,
    val category: String?,
    val description: String?,
    val img: String?
)

Это ПОЛЬЗОВАТЕЛЬ . просто данные.

data class User(
    val username: String,
    val email : String,
    val firstName: String,
    val lastName: String,
    val photoUrl: String?,
    val categories : List<Category>
)

Теперь НАБЛЮДЕНИЕ , которое содержит ПОЛЬЗОВАТЕЛЬ и КНИГА

data class Observation(
    val id: Int,
    val user: User,
    val book: Book,
    val page: Int,
    val description: String
)

Это означает, что существует отношение от 1 таблицы ( НАБЛЮДЕНИЕ ) к 2 таблицам ( КНИГА и ПОЛЬЗОВАТЕЛЬ ).

Все примеры I найденные связаны с отношением 1 к n, n к 1, n к m. Но в этом случае НАБЛЮДЕНИЕ связано с 2 ОТНОШЕНИЯМИ с 1 по 1.

Как хранить и извлекать этот вид СУЩЕСТВ ?

1 Ответ

1 голос
/ 24 января 2020

1.- Во-первых, вам нужно создать столбец id для таблицы Пользователь . id в таблицах User и Book будет установлен как PRIMARY KEY (уникальный идентификатор для каждой строки в этой таблице). Затем в таблице наблюдений вы измените тип столбцов пользователя и книги на Int. Вам не нужно будет хранить объект там, просто id из каждой таблицы, эти два столбца будут установлены как FOREIGN KEY. Вы создали свою реляционную базу данных.

2.- Для этого с помощью Room вы можете сделать что-то вроде этого:

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.ForeignKey.CASCADE
import androidx.room.PrimaryKey

@Entity(tableName = "Book")
data class Book(
        @ColumnInfo(name = "id") @PrimaryKey(autoGenerate = true) val id: Int,
        @ColumnInfo(name = "title") val title: String,
        @ColumnInfo(name = "author") val author: String,
        @ColumnInfo(name = "pages") val pages: Int?,
        @ColumnInfo(name = "editorial") val editorial: String?,
        @ColumnInfo(name = "category") val category: String?,
        @ColumnInfo(name = "description") val description: String?,
        @ColumnInfo(name = "img") val img: String?
)

@Entity(tableName = "User")
data class User(
        @ColumnInfo(name = "id") @PrimaryKey(autoGenerate = true) val id: Int,
        @ColumnInfo(name = "username") val username: String,
        @ColumnInfo(name = "email") val email : String,
        @ColumnInfo(name = "firstName") val firstName: String,
        @ColumnInfo(name = "lastName") val lastName: String,
        @ColumnInfo(name = "photoUrl") val photoUrl: String?,
        @ColumnInfo(name = "categories") val categories : List<Category>
)

@Entity(
        tableName = "list_items",
        foreignKeys = [ForeignKey(
                entity = User::class,
                parentColumns = ["id"],
                childColumns = ["user_id"],
                onDelete = CASCADE),
                       ForeignKey(
                    entity = Book::class,
                    parentColumns = ["id"],
                    childColumns = ["book_id"],
                    onDelete = CASCADE)])
data class Observation(
        @ColumnInfo(name = "id") @PrimaryKey(autoGenerate = true) val id: Int,
        @ColumnInfo(name = "user_id") val userId: Int,
        @ColumnInfo(name = "book_id") val bookId: Int,
        @ColumnInfo(name = "page") val page: Int,
        @ColumnInfo(name = "description") val description: String
)

Надеюсь, это поможет!

...