Android Kotlin Room 针对不同用户的不同实体

问题描述

我遇到了一个小问题。我有一个应用程序(游戏),我想使用 Room 创建数据库。只要我只有一个应用程序用户,一切都很好。我想要做的是为不同的登录用户拥有不同的数据库一个具有不同实体的数据库。我正在使用 Firebase 进行身份验证,因此我可以为每个当前登录用户设置 userId(字符串)。 我的实体类

    @Entity
data class PointOnField(
                        @PrimaryKey(autoGenerate = false)
                        var position: Int = 0,var moveUp: Int = Static.MOVE_AVAILABLE,var moveUpRight: Int = Static.MOVE_AVAILABLE,var moveRight: Int = Static.MOVE_AVAILABLE,var moveDownRight: Int = Static.MOVE_AVAILABLE,var moveDown: Int = Static.MOVE_AVAILABLE,var moveDownLeft: Int = Static.MOVE_AVAILABLE,var moveLeft: Int = Static.MOVE_AVAILABLE,var moveUpLeft: Int = Static.MOVE_AVAILABLE,var x:Int=0,var y:Int=0,var ball:Boolean = false)

我的道课:

  @Dao
interface PointOnFieldDao {

    @Insert
    suspend fun addPointOnField(pointOnField: PointOnField)

    @Query("SELECT * FROM pointOnField")
    suspend fun getAllPointsOnField() : List<PointOnField>

    @Update
    suspend fun updatePointOnField(pointOnField: PointOnField)

}

我的数据库

    @Database(
        entities = [PointOnField::class],version = 1
)
abstract class PointOnFieldEasyDatabase : RoomDatabase() {

    abstract fun getPointOnFiledDao() : PointOnFieldDao

    companion object{

        @Volatile private var instance : PointOnFieldEasyDatabase ?= null
        private val LOCK = Any()

        operator fun invoke(context: Context) = instance ?: synchronized(LOCK){
            instance ?: buildDatabase(context).also {
                instance = it
            }
        }

        private fun buildDatabase(context: Context) = Room.databaseBuilder(
                context.applicationContext,PointOnFieldEasyDatabase::class.java,"easydatabase"
        ).build()
    }
}

解决方法

您可以尝试从包含 @Entity 信息的类继承所有 user id。 并编写一个代码,按照您的预期添加当前登录 UserId 的选择。

@Entity
data class PointOnField(
@PrimaryKey(autoGenerate = false)
var position: Int = 0,var moveUp: Int = Static.MOVE_AVAILABLE,var moveUpRight: Int = Static.MOVE_AVAILABLE,var moveRight: Int = Static.MOVE_AVAILABLE,var moveDownRight: Int = Static.MOVE_AVAILABLE,var moveDown: Int = Static.MOVE_AVAILABLE,var moveDownLeft: Int = Static.MOVE_AVAILABLE,var moveLeft: Int = Static.MOVE_AVAILABLE,var moveUpLeft: Int = Static.MOVE_AVAILABLE,var x:Int=0,var y:Int=0,var ball:Boolean = false) : AuthorizedEntity()

class AuthorizedEntity(var userId: Long)