ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [안드로이드] 내장 DB로 Realm 사용하기
    안드로이드 2020. 6. 1. 19:23

    슥삭을 개발하면서 내장 DB를 써야 할 일이 생겼다. 아니 사실은 그 전부터 쓸 일은 많았는데, 미루고 미루다가 드디어 적용했다!

    안드로이드에서 사용할 수 있는 내장 DB의 종류는 꽤 많은데, 내가 Realm을 선택한 이유는 정말 간단하다.

     

    ✨Realm을 선택한 이유 ✨

    1. 데이터를 객체 형태로 저장한다. (쿼리문 싫어,,,)
    2. 커뮤니티가 활발하다. (구글링 열심히 하자!)

    자 이제 realm을 사용해보자.

     

     

    0. 설치하기

    아래 코드를 프로젝트 수준 build.gradle에 추가한다.

    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath "io.realm:realm-gradle-plugin:3.5.0"
        }
    }

    다음 코드를 애플리케이션 수준 build.gradle에 추가한다.

    apply plugin: 'realm-android'
    
    anroid {
        realm {
            syncEnabled = true
        }
    }

     

    이렇게 두개만 추가하면 realm 설치 끝 ❗️

     

     

     

    1. Realm 초기화하기

    Realm.init()으로 Realm을 초기화할 수 있다.

    초기화는 realm을 사용하고자 하는 Activity에서 해도 되지만, 한번만 초기화하면 되므로 Application 클래스에서 초기화를 해주었다.

    class SsgSagApplication : Application(){
    
        override fun onCreate(){
            super.onCreate()
            
            Realm.init(this)
            val config : RealmConfiguration = RealmConfiguration.Builder()
                .name("appdb.realm") // 생성할 realm 파일 이름 지정
                .deleteRealmIfMigrationNeeded()
                .build()
    
            Realm.setDefaultConfiguration(config)
            
    }

    🚫 해당 Application class는 manifests에 꼭 등록해주어야한다 ! 🚫

     

     

     

     

    2. Model 만들기

    데이터를 저장하는 Realm 모델 클래스는 RealmObject 를 상속받아서 생성해야한다.

     

    앱을 깔고 로그인한 뒤 한번 저장된 후 바뀔일이 크게 없는 device 정보를 내장 DB에 저장해놓으려 한다.

    이를 위해 아래와 같은 class를 만들었다.

    open class DeviceInfo : RealmObject(){
        var id : Int = 0
        var token =""
        var loginType: Int = 0
        var uuid =""
    }

     

    👉Realm의 모델에 관한 다양한 정보를 더 얻고 싶다면 아래의 링크에 들어가보자.

    https://realm.io/kr/docs/java/latest/#models

     

     

     

    3. Realm 가져오기

    이제 Realm을 사용하고 싶은 곳에서 Realm을 가져와서 사용할 수 있다.

    lateinit var realm : Realm
    
    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            
            realm = Realm.getDefaultInstance()
            
    }

     

    원하는 값은 메소드를 이용해서 가져올 수 있다.

    val realmDeviceInfo = realm.where(DeviceInfo::class.java).equalTo("id", 1 as Int).findFirst()

    👉 DeviceInfo 클래스에서 id가 1인 첫번째 데이터를 가져와서 realmDeviceInfo에 저장한다.

     

     

     

    4. Realm에 데이터 저장하기

    데이터 저장은 꼭! 트랜잭션 안에서 이루어져야 한다.

    fun setDeviceInfoUuid(uuid : String){
            // 트랜잭션 시작
            realm.beginTransaction()
            
            // id가 1인 DeviceInfo를 가져온다.
            val realmDeviceInfo = realm.where(DeviceInfo::class.java).equalTo("id", 1 as Int).findFirst()
            // id가 1인 DeviceInfo 객체가 이미 존재한다면
            if(realmDeviceInfo != null){
                // 그 객체의 uuid값 초기화
                realmDeviceInfo.uuid = uuid
            }else{ // id가 1인 DeviceInfo 객체가 존재하지 않는다면
         		// 객체를 새로 생성
                val realmObject = realm.createObject(DeviceInfo::class.java)
                realmObject.apply{
                    this.id = 1
                    this.uuid = uuid
                }
            }
            // 트랜잭션 종료
            realm.commitTransaction()
        }

    위 코드에서 이미 존재하는 객체의 값을 수정하는 것과 객체를 새로 만드는 경우를 모두 볼 수 있다.

     

     

     

     

     

     

    간단하게 Realm 사용법을 알아보았다!

    '내장 DB'를 딱 들으면 왠지 어려울 것 같아서 미루다가 꼭 필요해져서 사용해보았는데, 생각한 것 보다 쉽게 사용할 수 있는 것 같다.

    물론 위에서 본 것 처럼 트랜잭션 때문에 멀티스레딩을 하기 까다롭다는 단점이 있긴하지만, 간단하게 사용하려면 쉽게 접근할 수 있고 한국어로 사용법이 친절하게 나와있다는 장점 때문에 사용해볼만 한 것 같다!

     

    곧 다른 프로젝트를 사용해보려고 하는데, 거기서는 다른 걸 써보고 한번 비교해봐야지 😊

     

     

     

     

     

     

     

     

     

Designed by Tistory.