【问题标题】:how to use Room database if I need to make more than one table?如果我需要制作多张桌子,如何使用 Room 数据库?
【发布时间】:2020-11-21 21:49:42
【问题描述】:

目前我正在学习如何在 Android 中使用 Room。而我遵循的所有教程都只制作了一张表(即只有一个数据类)

如果我只想保存一个表,这里是数据库和 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
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 对象保存到两个表中。我的问题是

我是否需要创建两个不同的抽象类数据库,例如 NoteDatabaseProductDatabase 以及两个 Daos,例如 NoteDaoProductDao

如果我能把它结合起来,你能给我看看代码吗?

【问题讨论】:

  • 每个表需要一个实体,Database 注释的 entities 属性需要将它们全部列出。每个实体是否有一个 DAO 或将它们组合起来取决于您——Room 不在乎。任何具有关系的示例都将显示多个实体,例如this。你不想要多个RoomDatabase 类。

标签: android kotlin android-room android-jetpack


【解决方案1】:

您可以查看 google 提供的 sunflower 示例应用程序。

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

您需要在@Database 的“实体”列表属性中包含您的实体类。如上例 GardenPlanting 和 Plant。

【讨论】:

    【解决方案2】:

    为每个表创建一个带有 @Entity 注释的数据类。例如,下面是两个表:TableOneTableTwo

    @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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多