Room을 사용해서 로컬데이터베이스에 데이터 저장

taeyoung moon·2020년 6월 25일
0

android

목록 보기
1/5
post-custom-banner

문서를 통해 Room의 활용법을 익히고 프로젝트에 적용해보기
자세한 내용은
https://developer.android.com/training/data-storage/room?hl=ko
참고

우선 Room을 사용하기 위한 build.gradle 파일에 종속성 선언

```
apply plugin: 'kotlin-kapt'

dependencies {
        //room
        implementation"android.arch.persistence.room:runtime:2.2.5"test
        Implementation "android.arch.persistence.room:testing:2.2.5"
        kapt "android.arch.persistence.room:compiler:2.2.5"
}
```

개체를 사용하여 데이터 정의 - Entity로 사용할 data class 생성
Room 지속성 라이브러리를 사용할 때 관련 필드 세트를 항목으로 정의합니다. 각 항목의 경우 연결된 Database 객체 내에 테이블을 만들어 항목을 보유합니다. Database 클래스의 entities 배열을 통해 항목 클래스를 참조해야 합니다.

@Entity(tableName = "memories")
data class Memory(
    @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "memory_id") val id: Int = 0,
    @ColumnInfo(name = "memory_date") val date: String,
    @ColumnInfo(name = "memory_who") val who: String,
    @ColumnInfo(name = "memory_latitude") val latitude: Double,
    @ColumnInfo(name = "memory_longitude") val longitude: Double,
    @ColumnInfo(name = "memory_location") val location: String,
    @ColumnInfo(name = "memory_picture", typeAffinity = ColumnInfo.BLOB) val picture: ByteArray?,
    @ColumnInfo(name = "memory_content") val content: String?
)

Room DAO를 활용하여 데이터 엑세스
Room 지속성 라이브러리를 사용하여 앱 데이터에 액세스하려면 데이터 액세스 객체 또는 DAO를 사용하세요. 각 DAO에는 앱 데이터베이스의 추상 액세스를 제공하는 메서드가 포함되어 있으므로 이 Dao 객체 세트는 Room의 기본 구성요소를 형성합니다.

@Dao
interface MemoryDao {
    @Insert
    fun insertMemory(vararg memory: Memory)

    @Update
    fun updateMemory(memory: Memory)

    @Delete
    fun deleteMemory(memory: Memory)

    //선택한 날짜 안에 있는 모든 메모리 데이터 가져오기
    @Query("SELECT * FROM memories WHERE memory_date BETWEEN (:firstDate) AND (:lastDate)")
    fun loadMemoryForDate(firstDate : String, lastDate : String):List<Memory>

    //선택한 지역에 해당하는 모든 메모리 데이터 가져오기
    @Query("SELECT * FROM memories WHERE memory_location IN (:location)")
    fun loadMemoryBasedOnLocation(location : String) : List<Memory>

    //전체 사진 목록 받아오기
    @Query("SELECT memory_picture FROM memories")
    fun getAllPicture():List<ByteArray>

    //전체 메모리 데이터 가져오기
    @Query("SELECT * FROM memories")
    fun getAllMemories():List<Memory>

    //선택한 메모리 데이터 가져오기
    @Query("SELECT * FROM memories WHERE memory_id = (:memoryId) LIMIT 1")
    fun getCheckedMemory(memoryId : Int) : Memory
    
}

데이터베이스 생성
데이터베이스 생성을 위한 추상 클래스 생성

```
@Database(entities = arrayOf(Memory::class), version = 1)
             abstract class MemoryDatabase : RoomDatabase(){
             abstract fun memoryDao() : MemoryDao
}
```

테스트 예제

``` class DatabaseTestActivity : AppCompatActivity(),View.OnClickListener {
private lateinit var db : MemoryDatabase

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_database_test)

    db = Room.databaseBuilder(this, MemoryDatabase::class.java,"memory.db").allowMainThreadQueries().build()


}


override fun onClick(v: View?) {
    when(v!!.id){
        R.id.btn_insert -> {
            Log.d("11111","성공")
            db.memoryDao().insertMemory(
                Memory(
                    date = edit_date.text.toString(),
                    who = edit_who.text.toString(),
                    latitude = edit_latitude.text.toString().toDouble(),
                    longitude = edit_longitude.text.toString().toDouble(),
                    location = edit_location.text.toString(),
                    picture = null,
                    content = null
                )
            )
            textView.text = db.memoryDao().getAllMemories().joinToString()

        }
        R.id.btn_update -> {
            db.memoryDao().updateMemory(
                Memory(
                    date = edit_date.text.toString(),
                    who = edit_who.text.toString(),
                    latitude = edit_latitude.text.toString().toDouble(),
                    longitude = edit_longitude.text.toString().toDouble(),
                    location = edit_location.text.toString(),
                    picture = null,
                    content = null
                )
            )
            textView.text = db.memoryDao().getAllMemories().joinToString()
        }
        R.id.btn_delete -> {
            db.memoryDao().deleteMemory(
                Memory(
                    date = edit_date.text.toString(),
                    who = edit_who.text.toString(),
                    latitude = edit_latitude.text.toString().toDouble(),
                    longitude = edit_longitude.text.toString().toDouble(),
                    location = edit_location.text.toString(),
                    picture = null,
                    content = null
                )
            )
            textView.text = db.memoryDao().getAllMemories().joinToString()
        }
    }
}

}





profile
끈질긴 개발자
post-custom-banner

0개의 댓글