#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)