티스토리 뷰

일단 기본적으로 아래 부분을 먼저 Gradle(:app) 아래 한줄을 추가해주세요.

dependencies {
    ...
    implementation 'com.android.support:multidex:1.0.3'
    ...
}

아직 연습중이라 그런가 뭔가 위 줄을 먼저 추가해주는게 편하더라고요 (multidex)

 

Realm 을 Gradle 에 추가해줘야겠죠? 

그런데 이상할정도로 추가되지 않아서 고생한 사람(이정도면 버그 수집가)

https://www.mongodb.com/docs/realm/sdk/kotlin/install/

 

Install Realm - Kotlin SDK — Realm

Docs Home → Realm The Kotlin SDK supports two platforms, each with its own installation method:Before getting started, ensure your development environment meets the following prerequisites:Android Studio Bumblebee 2021.1.1 or higher.JDK 11 or higher.Kotl

www.mongodb.com

설치 방법은 위의 사이트를 참고했습니다. 

 

build.gradle (Project :AppName)

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'io.realm:realm-gradle-plugin:10.11.1'
    }
}

plugins {
    id 'com.android.application' version '7.4.2' apply false
    id 'com.android.library' version '7.4.2' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
    id "org.jetbrains.kotlin.kapt" version "1.6.20" apply false
}

 

build.gradle (Module :app)

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'org.jetbrains.kotlin.kapt'
}

apply plugin: "realm-android"
...
dependencies {
 ...
    implementation 'com.android.support:multidex:1.0.3'
    implementation 'io.realm:realm-gradle-plugin:10.10.1'
...
}

 

번외

- 참고로 설치가 잘 안되시는 분들은 아래를 확인해주세요.(저는 아래같은 오류가 떴습니다.)

Caused by: org.gradle.api.GradleException: Cannot use @TaskAction annotation on method IncrementalTransformTask.transform() because interface org.gradle.api.tasks.incremental.IncrementalTaskInputs is not a valid parameter to an action method.

 

gradle-wrapper.properties (Project Properties)에서 'distributionUrl'을 확인해주세요.

distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

 

 

여기까지가 기본 준비이고 이제 시작해봅시다. 

 

 

1. MultiDexApplication 을 사용하기 위해 MyApplication 이라는 클래스를 만들고 적용해줍시다. 

- 이름은 편하신 걸로 만드시면 됩니다.

class MyApplication : MultiDexApplication() {
    override fun onCreate() {
        super.onCreate()

    }
}

2. 적용을 위해 Manifest로 이동해 적용해 줍니다. (application 밑에 적어주시면 됩니다.)

<application
        android:name=".MyApplication"

3. 다시 MyApplication으로 이동해 Realm 을 추가해줍니다. 

class MyApplication : MultiDexApplication() {
    override fun onCreate() {
        super.onCreate()
        Realm.init(this) // Realm 생성
        val config : RealmConfiguration = RealmConfiguration.Builder()
            .name("MemberInfo.realm")
            .allowWritesOnUiThread(true)
            .schemaVersion(0) // migration 을 위해 추가 
            .deleteRealmIfMigrationNeeded()
            .build()
        Realm.setDefaultConfiguration(config)
    }
}

4. 이제 만들어주고 싶은 데이터 형식을 만들어 줍니다. (저는 아래처럼 만들어 볼께요.)

class MemberInfo : RealmObject() {
    @PrimaryKey var uniqueKey : String? = null // 각 데이터별 고유키
    var name : String? = null // 맴버 이름
    var age : Int = 0 // 나이
    var lastUpdate : Date = Date() // 생성 날짜
}

5. 데이터를 관리하는 클래스를 따로 만들어 줍니다.

- 저는 이 방식이 편해서 이렇게 했습니다

- 저는 이름이 동일한 사람이 없다고 가정하고 만약 이름이 같은 데이터를 넣으면 덮어쓰게 만들어 볼께요. 

class UtilRealm {
    private var realm: Realm = Realm.getDefaultInstance()
    init{
        realm = Realm.getDefaultInstance()
    }
    // Realm 데이터 생성 (등록) & 수정
    fun saveData(name:String ,age:Int){ //nowStep : 현재 총 걸음수

        realm.beginTransaction() // 편집 시작
        // writeDate
        val realmDeviceInfo = realm.where(MemberInfo::class.java).equalTo("name", name).findFirst()

        if(realmDeviceInfo != null){
            // 그 객체의 걸음값 초기화
            realmDeviceInfo.name = name
            realmDeviceInfo.age = age
            realmDeviceInfo.lastUpdate = Date()

        }else{ // 아예 새로 생성
            // 객체를 새로 생성
            val realmObject = realm.createObject(MemberInfo::class.java,UUID.randomUUID().toString())
            realmObject.apply{
                realmObject.name = name
                realmObject.age = age
                realmObject.lastUpdate = Date()
            }
            realm.copyToRealmOrUpdate(realmObject)
        }
        // 트랜잭션 종료
        realm.commitTransaction() //편집 종료

    }
    // Realm 데이터 검색
    fun searchAge(name: String) : Int {
        // 해당 이름으로 된 데이터가 있는지 확인
        // 없으면 0 반환
        val realmDeviceInfo = realm.where(MemberInfo::class.java).equalTo("name", name).findFirst()
        return realmDeviceInfo?.age ?: 0
    }
    // 로그로 전체 멤버 출력
    fun searchAllMember(){
        val realmDeviceInfo = realm.where(MemberInfo::class.java).findAll()
        for( i in realmDeviceInfo){
            println(i.name + "("+i.age+")")
        }
    }
    // Realm 데이터 삭제
    fun deleteAll(){
        realm.executeTransaction { realm ->
            val result: RealmResults<MemberInfo> =
                realm.where(MemberInfo::class.java).findAll()
            result.deleteAllFromRealm()
        }
    }
    fun deleteMember(name: String){
        realm.executeTransaction { realm ->
            val result: RealmResults<MemberInfo> =
                realm.where(MemberInfo::class.java).equalTo("name", name).findAll()
            result.deleteAllFromRealm()
        }
    }
}

 

6. 메인 엑티비티에서 호출해서 사용해볼께요.

class MainActivity : AppCompatActivity() {

//    var utilRealm : UtilRealm? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val utilRealm  = UtilRealm()

        utilRealm?.saveData("Tomas",10)
        utilRealm?.saveData("Sam",10)
        utilRealm?.saveData("Ellie",14)
        utilRealm?.saveData("Tomas",22)


        utilRealm?.searchAllMember()

        println("토마스 나이가 "+utilRealm?.searchAge("Tomas"))

        utilRealm?.deleteMember("Tomas")
        utilRealm?.searchAllMember()

        utilRealm?.deleteAll()

    }


}

실제로 해보시면 이런 데이터가찍혀요

 

7. 실제 기기에서 Realm 데이터 보기 

- 삭제하는 부분을 없애고 아래처럼만 넣고 실행해볼께요. 

utilRealm?.saveData("Tomas",10)
utilRealm?.saveData("Sam",10)
utilRealm?.saveData("Ellie",14)
utilRealm?.saveData("Tomas",22)
utilRealm?.saveData("Linny",50)
utilRealm?.saveData("Jon",9)
utilRealm?.saveData("Chris",30)

실행후 

안드로이드 스튜디오에서 

아래처럼 Device Manager 를 열어주시고 아래 사진에 표시된 버튼을 누르시면 Device File Explorer를 열수있어요.

Device File Explorer 내부에

/data/data/<PackageName>/files 로 가보시면 

아래처럼 보이실텐데 해당파일을 다운로드해주세요

저장해주세요

해당 파일은 Realm Studio 를 사용하시면 아래처럼 저장된 데이터를 확인할수있습니다.

짜잔

최대한 간단히 해보려 했는데

저도 아직 익숙치 않아서 시간이 좀 걸린 것 같네요.

(+ 각종 에러)

 

처음 하시는 분들에게 도움이 되었으면 좋겠네요.

오늘도 파이팅입니다! 

댓글