구현 과정
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)
}
}
'안드로이드' 카테고리의 다른 글
[안드로이드] 예제:MVVM+AAC를 이용한 RecyclerView 4 (0) | 2020.08.12 |
---|---|
[안드로이드] 예제:MVVM+AAC를 이용한 RecyclerView 3 (0) | 2020.08.12 |
[안드로이드] 예제:MVVM+AAC를 이용한 RecyclerView 1 (1) | 2020.08.12 |
[안드로이드] asynctask의 이해 (0) | 2020.03.31 |
Apache & Tomcat 및 HTTP, Socket (0) | 2020.03.28 |