как использовать базу данных комнат, если мне нужно создать более одной таблицы?

#android #kotlin #android-room #android-jetpack

#Android #kotlin #android-room #android-реактивный ранец

Вопрос:

в настоящее время я изучаю, как использовать Room в Android. и все учебные пособия, которым я следую, создают только одну таблицу (т.Е. Только Один класс данных)

вот база данных и dao, если я хочу сохранить только одну таблицу (т.Е. Note Объект здесь)

вот класс данных базы данных

 @Database(entities = [Note::class], version = 1)
@TypeConverters(DataConverter::class)
abstract class NoteDatabase : RoomDatabase() {

    abstract val noteDao: NoteDao

    companion object {

        @Volatile
        private var INSTANCE: NoteDatabase? = null

        fun getInstance(context: Context): NoteDatabase {

            synchronized(this) {

                var instance = INSTANCE
                if (instance == null) {
                    instance = Room.databaseBuilder(
                            context.applicationContext,
                            NoteDatabase::class.java,
                            "note_database"
                        )

                        .fallbackToDestructiveMigration()  
                        .build()

                    INSTANCE = instance
                }

                return instance
            }
        }
    }
}
 

и вот Dao

 @Dao
interface NoteDao {

    @Insert
    fun save(note: Note)

    @Delete
    fun delete(note: Note)

    @Query("DELETE FROM note")
    fun deleteAllNotes()

    @Query("SELECT * FROM note ORDER BY priority DESC")
    fun getAllNotes() : LiveData<List<Note>>


}
 

что делать, если я хочу сохранить более одной таблицы, если, например, я хочу сохранить объект Note и Product в две таблицы. мой вопрос

нужно ли мне создавать 2 разные базы данных абстрактных классов, такие как NoteDatabase and ProductDatabase , а также два Dao, такие как NoteDao and ProductDao ?

если я могу это объединить, не могли бы вы показать мне код?

Комментарии:

1. Вам понадобится по одному объекту на таблицу, и entities свойство вашей Database аннотации должно будет перечислить их все. Есть ли у вас по одному DAO на объект или вы объединяете их, зависит от вас — комнате все равно. Любой пример, имеющий отношения, покажет несколько объектов, таких как этот . Вам не нужно несколько RoomDatabase классов.

Ответ №1:

Вы можете взглянуть на пример приложения sunflower от Google.

 @Database(entities = [GardenPlanting::class, Plant::class], version = 1, exportSchema = false)
 

Вам нужно будет включить свой класс entity в свойство списка «entities» в @Database. Как в приведенном выше примере GardenPlanting и Plant.

Ответ №2:

Создайте класс данных с аннотацией @Entity для каждой таблицы. Например, ниже приведены две таблицы: tableOne и tableTwo

 @Entity(tableName = "table_one")
data class TableOne(
    @PrimaryKey
    @ColumnInfo(name = "id")
    val id: Int,

    @ColumnInfo(name = "title")
    val title: String
)


@Entity(tableName = "table_two")
data class TableTwo(
    @PrimaryKey
    @ColumnInfo(name = "id")
    val id: Int,

    @ColumnInfo(name = "name")
    val name: String
)
 

Теперь перечислите эти таблицы как объекты в @Database

 @Database(entities = [TableOne::class, TableTwo::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun appDao(): AppDao
}