1

I wanna create a menu about sorting by Task's attributes but don't know how because I am using database combined with Live Data, View Model and coroutine which is very complicated. Please show me how to handle these logics.

Data file

@Entity(tableName = "task_table")
data class Task(
    //id is the PrimaryKey which is auto generated by Android Room Database
    @PrimaryKey(autoGenerate = true)
    val id: Int,
    val date: String,
    val content: String,
    var timeLeft: String,
    var isDone: Boolean
):Parcelable

Dao file

@Dao
interface TaskDao {
    // means it will be just ignore if there is a new exactly same task then we're gonna just ignore it
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun addTask(task: Task)

    @Delete
    suspend fun deleteTask(task: Task)

    @Update
    suspend fun updateTask(task: Task)

    @Query("SELECT * FROM task_table order by timeLeft ASC")
    fun readAllData(): LiveData<MutableList<Task>>

    @Query("SELECT COUNT(id) FROM task_table")
    fun getCount(): Int
}

Database file

@Database(entities = [Task::class], version = 1, exportSchema = false)
abstract class TaskDatabase : RoomDatabase() {
    abstract fun taskDao(): TaskDao


    companion object {
        @Volatile
        private var INSTANCE: TaskDatabase? = null
        fun getDatabase(context: Context): TaskDatabase {
            val tempInstance = INSTANCE
            if (tempInstance != null) {
                return tempInstance
            }
            synchronized(this)
            {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    TaskDatabase::class.java,
                    "task_database"
                ).build()
                INSTANCE = instance
                return instance
            }
        }
    }
}

Repository file

// a repository class abstracts access to multiple data sources
class TaskRepository(private val taskDao: TaskDao) {
    val readAllData: LiveData<MutableList<Task>> = taskDao.readAllData()

    suspend fun addTask(task: Task) {
        taskDao.addTask(task)
    }

    suspend fun deleteTask(task: Task) {
        taskDao.deleteTask(task)
    }

    suspend fun updateTask(task: Task) {
        taskDao.updateTask(task)
    }


}

ViewModel file

class TaskViewModel(application: Application) : AndroidViewModel(application) {
    val readAllData: LiveData<MutableList<Task>>
    private val repository: TaskRepository

    init {
        val taskDao = TaskDatabase.getDatabase(application).taskDao()
        repository = TaskRepository(taskDao)
        readAllData = repository.readAllData
    }

    fun addTask(task: Task) {
        viewModelScope.launch(Dispatchers.IO) {
            repository.addTask(task)
        }
    }

    fun updateTask(task: Task) {
        viewModelScope.launch(Dispatchers.IO) {
            repository.updateTask(task)
        }
    }

    fun deleteTask(task: Task) {
        viewModelScope.launch(Dispatchers.IO) {
            repository.deleteTask(task)
        }
    }


}

In my fragment these will be a menu to choose how recyclerview items should be sorted. Don't know how to handle these logic. Please help. I appreciate!

bovietvidai
  • 105
  • 5
  • Does this answer your question? https://stackoverflow.com/questions/51358606/how-to-sort-list-in-recyclerview-on-android – Darshan Sep 02 '22 at 18:17

0 Answers0