- Room 사용하기
몇 가지 추가를 해줘야 한다.
//kapt 추가
apply plugin: 'kotlin-kapt'
dependencies {
//Room 추가
def room_version = "2.2.3"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor
// optional - Kotlin Extensions and Coroutines support for Room
implementation "androidx.room:room-ktx:$room_version"
// optional - RxJava support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// Test helpers
testImplementation "androidx.room:room-testing:$room_version"
}
그리고 Room을 위해 3가지 class를 만들었다.
Diaty.kt
@Entity(tableName = "diary")
data class Diary (
@PrimaryKey(autoGenerate = true) val _id: Int,
@ColumnInfo(name = "title") val title: String?,
@ColumnInfo(name = "content") val content: String?
)
Mongo에서 스키마를 만들듯 Entity를 만들었다.
DiaryDao.kt
@Dao
interface DiaryDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)//id가 같을시 대체된다고 함.
fun insert(diary: Diary)
@Query("SELECT * FROM diary")
fun getAll(): List<Diary>
@Query("SELECT * FROM diary WHERE _id IN (:diaryIds)")
fun loadAllByIds(diaryIds: IntArray): List<Diary>
@Query("SELECT * FROM diary WHERE title LIKE :title AND " +
"content LIKE :content LIMIT 1")
fun findByTitle_content(title: String, content: String): Diary
@Insert
fun insertAll(vararg diaries: Diary)
@Delete
fun delete(diary: Diary)
}
기본적인 기능을 하는 sql문을 작성했다.
AppDatabase.kt
@Database(entities = arrayOf(Diary::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun diaryDao(): DiaryDao
companion object {
private var INSTANCE: AppDatabase? = null
fun getInstance(context: Context): AppDatabase? {
if (INSTANCE == null) {
synchronized(AppDatabase::class) {
INSTANCE = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"dbname.db"
).build()
}
}
return INSTANCE
}
fun destoryInstance() {
INSTANCE = null
}
}
}
Room은 한 개 만들어 놓고 여러 번 사용하기 때문에 싱글톤으로 구현하였다.
그리고 사용할 때는 비동기 처리를 해주어야한다. 이건 3편에 작성하기로 하자.
참고: https://developer.android.com/jetpack/androidx/releases/room
'개발 일기 > Android' 카테고리의 다른 글
[Kotlin] 간단 메모장 만들기4 #RecyclerView #Adapter (0) | 2020.02.19 |
---|---|
[Kotlin] 간단 메모장 만들기3 #LiveData #ViewModel (0) | 2020.02.19 |
[Kotlin] 간단 메모장 만들기 1 #Intent #FloatingActionButton #다크모드 (0) | 2020.02.17 |
[Kotlin] Floating Button 과 QRCODE 인식 (0) | 2019.12.13 |
[Kotiln] WebView ACCESS_DENIED (0) | 2019.12.10 |