У меня проблемы с выяснением того, как я должен обновлять данные в базе данных комнат после изменения порядка элементов в RecyclerView.Как я должен обновить элементы LiveData в комнате на основе действий пользователя?
Использование ItemTouchHelper.Callback Я настроил обратный вызов onMove, который может вносить изменения в порядок элементов, представленных пользователю (при перетаскивании иdrop), но когда я звоню, чтобы обновить порядок элементов в базе данных комнат, используя объект ViewModel, пользователь может перемещать элементы только по одному за раз.Поэтому, если вы перетащите элемент, он будет перемещаться только на один пробел.
Это функция onMove, которую я определил в ListAdapter, которая реализует ItemTouchHelperAdapter для обратного вызова.
override fun onMove(
recyclerView: RecyclerView,
fromViewHolder: RecyclerView.ViewHolder,
toViewHolder: RecyclerView.ViewHolder
): Boolean {
d(this.TAG, "swap viewHolders: " + fromViewHolder.adapterPosition + " to " + toViewHolder.adapterPosition)
val workoutRoutine1 = workoutRoutines[fromViewHolder.adapterPosition]
val workoutRoutine2 = workoutRoutines[toViewHolder.adapterPosition]
workoutRoutine1.orderNumber = toViewHolder.adapterPosition.toLong()
workoutRoutine2.orderNumber = fromViewHolder.adapterPosition.toLong()
//this.workoutRoutinesViewModel.update(workoutRoutine1)
//this.workoutRoutinesViewModel.update(workoutRoutine2)
notifyItemMoved(fromViewHolder.adapterPosition, toViewHolder.adapterPosition)
return true
}
Это мой объект DAO
@Dao
interface WorkoutRoutineDAO {
@Insert
suspend fun insert(workoutRoutine: WorkoutRoutine)
@Update(onConflict = OnConflictStrategy.REPLACE)
suspend fun update(workoutRoutine: WorkoutRoutine)
@Delete
suspend fun delete(workoutRoutine: WorkoutRoutine)
@Query("DELETE FROM workout_routine_table")
fun deleteAll()
@Query("SELECT * FROM workout_routine_table ORDER BY order_number ASC")
fun getAllWorkoutRoutines(): LiveData<List<WorkoutRoutine>>
@Query("SELECT COALESCE(MAX(order_number), -1) FROM workout_routine_table")
fun getLargestOrderNumber(): Long
}
Этомой объект RoomDatabase
@Database(entities = [WorkoutRoutine::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun workoutRoutineDAO(): WorkoutRoutineDAO
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getDatabase(
context: Context,
scope: CoroutineScope
): AppDatabase {
return INSTANCE ?: synchronized(this) {
val instance =
Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, "app_database")
.addCallback(WorkoutRoutineDatabaseCallback(scope))
.build()
INSTANCE = instance
instance
}
}
}
private class WorkoutRoutineDatabaseCallback(
private val scope: CoroutineScope
) : RoomDatabase.Callback() {
}
}
Это объект ViewModel, который я реализовал.
class WorkoutRoutinesViewModel(application: Application) : AndroidViewModel(application) {
private val workoutRoutinesRepository: WorkoutRoutineRepository
val allWorkoutRoutines: LiveData<List<WorkoutRoutine>>
init {
// Get the DAO
val workoutRoutineDAO = AppDatabase.getDatabase(application, viewModelScope).workoutRoutineDAO()
// Build a new data repository for workout routines
workoutRoutinesRepository = WorkoutRoutineRepository(workoutRoutineDAO)
// Get a live view of the workout routines database
allWorkoutRoutines = workoutRoutinesRepository.allRoutines
}
fun insert(workoutRoutine: WorkoutRoutine) = viewModelScope.launch(Dispatchers.IO) {
workoutRoutinesRepository.insert(workoutRoutine)
}
fun update(workoutRoutine: WorkoutRoutine) = viewModelScope.launch(Dispatchers.IO) {
workoutRoutinesRepository.update(workoutRoutine)
}
fun delete(workoutRoutine: WorkoutRoutine) = viewModelScope.launch(Dispatchers.IO) {
workoutRoutinesRepository.delete(workoutRoutine)
}
}
Я ожидаю, что пользователь сможет переместить элемент n пробелов, затем удалить его и получить обновлениеВыполнение базы данных в комнату, когда пользователь удаляет элемент, но если я поместил обновление комнаты в метод onMove, пользователь сможет переместить элемент только один раз.
Я пытаюсь понять правильный способ обновленияДанные комнаты, когда порядок объектов изменяется в представлении переработчика.Я пытаюсь сохранить порядок этих объектов, даже когда пользователь выходит из приложения или меняет действия или что-то еще.Как мне вернуть эти изменения обратно в базу данных Room, используя LiveData?