본문 바로가기

안드로이드

[안드로이드] 예제:MVVM+AAC를 이용한 RecyclerView 2

구현 과정

1. 프로젝트 구성

2. Room 영속성 라이브러리 관련 클래스 구현

3. Repository 구현

4. ViewModel 구현

5. MainActivity 구현

6. RecyclerView 구현

7. AddActivity 구현

 


Todo.kt : Entity

id, title, decripton 필드를 가진 data class를 정의한다. 

@Entity
data class Todo(
    //autoGenerate는 null을 받으면 ID 값을 자동으로 할당해줌
    @PrimaryKey(autoGenerate = true)
    var id: Int?,

    @ColumnInfo(name ="title")
    var title: String,

    @ColumnInfo(name="description")
    var description: String
    )
{
    constructor(): this(null,"","")
}

 

TodoDAO.kt : DAO

데이터베이스에 접근하기 위한 인터페이스를 구현한다. 

@Dao
interface TodoDao {
    @Query("SELECT * FROM Todo")
    fun getAll(): LiveData<List<Todo>>

    @Insert
    fun insert(todo: Todo)

    @Update
    fun update(todo: Todo)

    @Delete
    fun delete(todo: Todo)
}

 

TodoDatabase.kt : RoomDatabase

실제 접근되는 데이터베이스를 정의한다. (싱글톤 패턴을 활용하였음)

@Database(entities = [Todo::class], version = 1)
abstract class TodoDatabase : RoomDatabase() {
    abstract fun todoDao(): TodoDao

    //싱글톤 패턴
    companion object{
        private var INSTANCE : TodoDatabase? = null

        fun getInstance(context: Context): TodoDatabase? {
            if (INSTANCE == null) {
                synchronized(TodoDatabase::class) { //synchronized: 여러 스레드가 동시에 접근 불가. 동기적으로 접근
                    INSTANCE = Room.databaseBuilder(context.applicationContext,
                        TodoDatabase::class.java, "todo")
                        .fallbackToDestructiveMigration()
                        .build()
                }
            }
            return INSTANCE
        }
    }

}
    

Repository.kt : Repository

Repository를 데이터 소스를 접근하는데 필요한 로직를 캡슐화를 위한 클래스 혹은 컴포넌트이다. Repository에 대해서는 나중에 자세히 다루어보자.

class Repository(application: Application) {
    private val todoDatabase: TodoDatabase = TodoDatabase.getInstance(application)!!
    private val todoDao: TodoDao = todoDatabase.todoDao()
    private val todos:LiveData<List<Todo>> = todoDao.getAll()

    fun getAll(): LiveData<List<Todo>>{
        return todos
    }

    fun insert(todo: Todo){
        todoDao.insert(todo)
    }
    fun delete(todo: Todo){
        todoDao.delete(todo)
    }
}