TIl. 안드로이드 앱 kotlin DB Room

Devback·2021년 1월 14일
1

😁 Room이란 ?

Room은 orm(object relational mapping)라이브러리입니다. 쉽게 말해 Room은 데이터베이스의 객체를 코틀린 or 자바 객체로 매핑해주는것입니다.
ROOM은 SQLite의 추상레이어 위에 제공하고 있으며 SQLite의 모든 기능을 제공하면서 편한 데이터베이스의 접근을 허용합니다.

😁 Room의 장점

적은 양의 데이터는 로컬에서 데이터를 유지하면 큰 이점을 얻을 수 있습니다. 일반적으로 장치가 네트워크에 엑세스 할 수 없을 경우에도 사용자가 오프라인으로 컨텐츠를 탐색할 수 있도록 관련 데이터를 캐시하는 것입니다. Room 라이브러리는 SQlite를 추상화 하여 Sql의 모든 기능을 활용하면서 데이터베이승 액세를 원활하게 수행할 수 있도록 합니다. 공식 문서에서는 반복적이고 에러 유발을 최소화 하는 annotation과 마이그레이션을 하기 쉽다는 이유로 sqlite보다 room 라이브러리를 쓰는 것을 추천하고 있습니다.

😁 Room의 3가지 개념

Database (데이터베이스) : 저장하는 데이터의 집합 단위를 말합니다.
Entity (항목) : 데이터베이스 내의 테이블을 의미합니다.
DAO (다오):데이터베이스에 접근하는 함수 메소드(insert, update, delete, ...)를 제공합니다

😁 Room 설정 하기

room을 사용하기 위해서는 build.grdle : app 에 아래의 코드를 넣어야 합니다.


dependencies {
  def room_version = "2.2.6"

  implementation "androidx.room:room-runtime:$room_version"
  kapt "androidx.room:room-compiler:$room_version"

  // optional - Kotlin Extensions and Coroutines support for Room
  implementation "androidx.room:room-ktx:$room_version"

  // optional - Test helpers
  testImplementation "androidx.room:room-testing:$room_version"
}

😁 오류...

저는 공식문서에서 하라는 대로 했을 뿐인데 오류가 났는데요.
kapt에서 오류가 났습니다. kapt가 오류가 난다면 plugins에서 'id kotlin-kapt'을 추가해보세요.

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
    id 'kotlin-kapt' // 요걸 추가해야합니다.
}

😁 interface 설정

package com.example.roomdatabase2
import androidx.room.*

@Dao
interface TodoDao {
    @Query("SELECT * FROM Todo")
    fun getAll() : List<Todo>
    @Delete
    fun delte(todo: Todo)
    @Update
    fun update(todo: Todo)
    @Insert
    fun insert(todo: Todo)
}

😁 class 설정

package com.example.roomdatabase2

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity 
TodoList 
data class Todo(  var title: String ) {
	// 고유한 키값 부여 
    @PrimaryKey(autoGenerate = true) var id: Int = 0
}

😁 DataBase 설정

// AppDataBase

package com.example.roomdatabase2

import androidx.room.Database
import androidx.room.RoomDatabase

@Database(entities = arrayOf(Todo::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun todoDao(): TodoDao
}

Activity 설정


package com.example.roomdatabase2

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.Observer
import androidx.room.Room
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val db = Room.databaseBuilder(
                applicationContext,
                AppDatabase::class.java, "database-name"
        ).allowMainThreadQueries().build()
        // allowMainThreadQueries를 추가하지 않으면 메인쓰레드에서 db에 접
        근할 수 없다. 
        
        // 변경된 내용이 여기로 들어가게 된다. 
		  text.text = db.todoDao().getAll().toString()
				
            // 버튼을 눌렀을 text가 추가 되도록 설정 
        button.setOnClickListener {
        	
            db.todoDao().insert(Todo(et_input.text.toString()))
            text.text = db.todoDao().getAll().toString()
        }
    }
}
profile
나랑 같이 개발할 사람🖐

0개의 댓글