Как сохранить изменения в порядке RecyclerView с Room и LiveData? - PullRequest
0 голосов
/ 02 июля 2019

У меня проблемы с выяснением того, как я должен обновлять данные в базе данных комнат после изменения порядка элементов в 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?

1 Ответ

0 голосов
/ 02 июля 2019

Вы можете следовать этому руководству по Udacity. Это бесплатно, сделано Google и использует Kotlin.

...