【问题标题】:Android Kotlin Room different entities for different usersAndroid Kotlin Room 针对不同用户的不同实体
【发布时间】:2021-01-12 10:41:57
【问题描述】:

我面临一个小问题。我有一个应用程序(游戏),我想使用 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()
    }
}

【问题讨论】:

  • 您希望每个用户有不同的实体定义?如果不是,你可以用用户名替换数据库名称,这将保证用户分离
  • 我尝试过类似 name:"easydatabase"+user.useId 并将 user.userId 传递给 buildDatabase 函数...创建第二个数据库(使用另一个 userId)后出现错误...
  • 我在buildDatabase 中传递用户名。为什么这种方法不适合你?
  • android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: PointOnField.position (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY[1555]) 这是我在尝试为第二个用户构建数据库时得到的结果。 .
  • 您是否先销毁现有用户数据库的实例? Companion Object 是一个单例,因此您不能同时激活两个实例,销毁实例后,您应该能够创建新数据库或打开现有数据库

标签: android database kotlin android-room entities


【解决方案1】:

您可以尝试从包含user id 信息的类继承您的所有@Entity。 并编写一个代码,按照您的预期添加当前登录的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)

【讨论】:

    猜你喜欢
    • 2018-07-10
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多