Android Kotlin размещает разные объекты для разных пользователей

#android #database #kotlin #android-room #entities

#Android #База данных #kotlin #android-комната #объекты

Вопрос:

Я столкнулся с небольшой проблемой. У меня есть приложение (игра), и я хотел бы создать базу данных с помощью Room. Все в порядке, пока у меня есть только один пользователь приложения. Что я хотел бы сделать, так это иметь разные базы данных или одну базу данных с разными объектами для разных зарегистрированных пользователей. Я использую Firebase для аутентификации, поэтому я могу иметь идентификатор пользователя (строку) для каждого пользователя, вошедшего в систему в данный момент. Мой класс объектов:

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

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

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

1. вы ожидаете разных определений объектов для каждого пользователя? если нет, вы могли бы просто заменить имя базы данных на имя пользователя, что гарантировало бы разделение пользователей

2. Я попытался сделать что-то вроде name: «easydatabase» user.useId и передать user.userId для функции buildDatabase… После создания второй базы данных (с другим идентификатором пользователя) я получил ошибки…

3. Я делаю это, передавая имя пользователя buildDatabase . Почему этот подход не работает для вас?

4. android.database.sqlite. Исключение SQLiteConstraintException: сбой УНИКАЛЬНОГО ограничения: PointOnField.position (код 1555 SQLITE_CONSTRAINT_PRIMARYKEY[1555]) это то, что я получаю, когда пытаюсь создать базу данных для второго пользователя…

5. вы сначала уничтожили экземпляр существующей пользовательской базы данных? Сопутствующий объект является одноэлементным, поэтому у вас не может быть двух активных экземпляров одновременно. После уничтожения экземпляра вы сможете либо создать новую базу данных, либо открыть существующие

Ответ №1:

Вы можете попытаться наследовать все ваши @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)