티스토리 뷰

반응형

안드로이드에서 기본으로 제공하는 SharedPreference는 키-밸류 방식으로 데이터를 저장하는데 복잡한 DB는 구현하기 어렵습니다.

 

안드로이드에서 복잡한 DB를 구현하는데 많이 사용되는 RDB 방식의 데이터 베이스는 Realm입니다.

 

* Realm 최신 버전

https://docs.mongodb.com/realm/tutorial/android-kotlin/#std-label-android-kotlin-tutorial 

 

Android Kotlin Tutorial — MongoDB Realm

Create a Task Tracker App Android Kotlin TutorialIn this tutorial, you will create a task tracker app that allows users to:Register themselves with email and password.Sign in to their account with their email and password and sign out later.View a list of

docs.mongodb.com

* Realm 구버전

https://docs.mongodb.com/realm-legacy/docs/kotlin/latest/index.html

 

Realm: Create reactive mobile apps in a fraction of the time

 

docs.mongodb.com

Realm을 사용해서 DB를 어떻게 구성하는지 알아봅니다.

(참고로 Realm 구버전을 기준으로 설명하겠습니다)

 

구버전의 튜토리얼 처럼, 프로젝트 및 앱 수준의 build.gradle의 의존성 부분에 코드를 추가합니다.

* build.gradle(Project)

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:7.0.0-beta"
    }
}
반응형

앱 수준의 build.gradle 부분에 플러그인을 달아주는데, 플러그인 중에서도 제일 마지막으로 달아줍니다. 'kaput' Not Found라는 에러가 표시되면, 해당 플러그인 또한 같이 넣어줍니다.

* 앱 수준의 build.gradle

apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android

 

이후로 Sync를 맞추고, 액티비티를 생성해줍니다.

생성된 액티비티의 레이아웃에 실습으로 버튼 3개를 만들어주도록 합니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".RealmActivity">


    <Button
        android:id="@+id/btn_save"
        android:text="저장하기"
        android:layout_width="100dp"
        android:layout_height="100dp"/>

    <Button
        android:id="@+id/btn_load"
        android:text="불러오기"
        android:layout_width="100dp"
        android:layout_height="100dp"/>

    <Button
        android:id="@+id/btn_delete"
        android:text="삭제하기"
        android:layout_width="100dp"
        android:layout_height="100dp"/>

</LinearLayout>

 

액티비티에서 Realm을 사용하는 방법을 알아봅니다.  먼저 아래의 전체적인 코드를 확인합니다.

class RealmActivity : AppCompatActivity() {

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

        Realm.init(this@RealmActivity)      
        val config: RealmConfiguration = RealmConfiguration.Builder()
            .deleteRealmIfMigrationNeeded()
            .build()
            
        Realm.setDefaultConfiguration(config)
        
        val realm = Realm.getDefaultInstance()

        btn_save.setOnClickListener {
            realm.executeTransaction {
                with(it.createObject(Animal::class.java)) {
                    this.name = "토끼"
                    this.type = "소동물"
                }
            }
        }

        btn_load.setOnClickListener {
            realm.executeTransaction {
                val data = it.where(Animal::class.java).findFirst()
                Log.d("동물", "동물정보 : " + data)
            }
        }
        
       btn_delete.setOnClickListener {
            realm.executeTransaction {
                it.where(Animal::class.java).findFirst().deleteFromRealm()
                //it.where(Animal::class.java).findAll().deleteAllFromRealm()
 
            }
        }
    }
}

 

먼저, Realm을 init 해줘야 합니다. 마치 초기화를 시켜서 사용할 준비를 하는 것과 같습니다. init의 인자로 context(this)를 넣어줍니다. config 부분은 초기화의 방식을 정하는 부분인데, RealmConfiguration에서 설정한 방식대로 초기화가 이루어지도록 합니다. Builder( )는 configuration을 만드는 역할을 하며, 이후 메소드 체이닝을 통해 deleteRealmIfMigrationNeeded 및 build 처럼, 원하는 메소드를 이어줍니다.

 

deleteRealmIfMigrationNeeded 메소드는 말그대로, 테이블에 새로운 필드나 레코드가 추가되었을 경우 해당 테이블을 없애는 역할을 합니다. 테이블 내용이 변경되면, 기존 테이블과 변경된 부분을 합치는데 이러한 작업을 Migration이라고 부릅니다.

 

Realm.setDefaultConfiguration(config) 부분은, Realm의 디폴트된 초기화 방식에 만들어준 초기화 방식을 넣어준 것입니다.

 

그리고 realm 변수에 Realm.getDefaultInstance() 를 할당하여 Realm을 생성해줍니다.

Realm.init(this@RealmActivity)
val config: RealmConfiguration = RealmConfiguration.Builder()
            .deleteRealmIfMigrationNeeded()
            .build()
            
Realm.setDefaultConfiguration(config)

val realm = Realm.getDefaultInstance()

 

이후로 Realm을 사용하기 위해서는, 테이블이 필요합니다. 

동물의 이름과 종류가 들어갈 Animal 테이블을 만들어줍니다. 해당 클레스는 테이블이 되며, RealmObject를 상속받습니다. name, type은 필드값이 됩니다. 테이블 클래스를 열어주기 위해서 class 앞쪽에 open 키워드를 코딩합니다.

* Animal.kt 파일 (테이블 파일)

package com.example.myapplication

import io.realm.RealmObject

open class Animal : RealmObject() {
    var name: String? = null
    var type: String? = null
}

 

이제 버튼에 따라 테이블이 생성되고, 불러오고, 없어지도록 하는 코딩을 알아봅니다. 앞전에 만들어준 세 개의 버튼 id 값을 가져온 후, 리스너를 달아줍니다. 트랜잭션(작업의 단위)을 실행하는 exexuteTransaction을 사용합니다. 여기서 it은 Realm을 가리킵니다. 테이블을 생성하는 createObject 메소드 안에 파라미터로 Animal::class.java, 즉 동물 클래스(테이블)를 넣어줍니다. 그리고 with 함수로 묶어버리면, this 키워드를 통해 테이블을 지칭할 수 있게 됩니다. this는 즉 Animal인 셈입니다.

name과 type에 원하는 내용을 할당합니다.

 

비슷한 맥략으로 정보를 불러오는 버튼 쪽에서, it.where(Animal::class.java).findFirst() 부분을 살펴 봅시다. it은 Realm을 가리키며, Animal 클래스 테이블에서 findFirst( ) 첫번째 데이터를 찾으라는 의미입니다. 이때 where 메소드를 사용한 것을 기억하십시오. 

 

마지막에는, 일부 데이터를 지울때는, findFirst().deleteFromRealm() 처럼, 원하는 데이터를 먼저 찾고 deleteFromRealm을 사용하고, 모든 데이터를 지우는 경우에는 findAll().deleteAllFromRealm()을 사용하면 됩니다.

       btn_save.setOnClickListener {
            realm.executeTransaction {
                with(it.createObject(Animal::class.java)) {
                    this.name = "토끼"
                    this.type = "소동물"
                }
            }
        }

        btn_load.setOnClickListener {
            realm.executeTransaction {
                val data = it.where(Animal::class.java).findFirst()
                Log.d("동물", "동물정보 : " + data)
            }
        }
        
       btn_delete.setOnClickListener {
            realm.executeTransaction {
                it.where(Animal::class.java).findFirst().deleteFromRealm()
                //it.where(Animal::class.java).findAll().deleteAllFromRealm()
 
            }
        }

그럼 안드로이드 데이터베이스에 관한 설명은 여기서 마치겠습니다.

반응형

'Android App Coding' 카테고리의 다른 글

안드로이드 네트워크 Network  (0) 2021.07.13
비동기 방식 Async  (0) 2021.07.10
안드로이드 데이터베이스(DB) Shared Preference  (0) 2021.07.10
탭레이아웃 2편 TabLayout  (0) 2021.07.09
탭레이아웃 TabLayout  (0) 2021.07.09
댓글