반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

Android Realm 기본 사용법(Kotlin) 본문

Android

Android Realm 기본 사용법(Kotlin)

huiung 2020. 5. 24. 16:00
반응형

모든 소스는 Kotline 으로 작성 되었습니다.

 

 

안드로이드 내부 DB로 Sqlite를 많이 사용 하였지만 Realm이 장점이 많아 요즘 많이 사용한다고 합니다.

검색을 하면 여러 장점들을 찾을 수 있으니 궁금 하신 분들은 찾아 보시기 바랍니다. 

저도 한번도 안써봤기 때문에 간단하게 CRUD 동작을 하는 예제 프로그램을 만들어 보았습니다. 

 

이전 게시글에서 만들었던 앱의 소스코드에 Realm 을 관리하는 코드를 추가 시키고 fragment의 textview에서 CRUD테스트를 한번 해보겠습니다.

 

우선 Realm을 사용하기 위해서 프로젝트 수준의 build.gradle에 아래의 코드를 추가 해 줍니다.

 

classpath 'io.realm:realm-gradle-plugin:10.0.0-ALPHA.1'

 

그리고 모듈 수준의 build.gradle로 가서 아래의 코드를 추가 해주면 됩니다.

 

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

 

이후 database.kt 라는 파일을 하나 생성하고 data를 담을 클래스와 RealmManager를 object로 각각 선언 하였습니다.

data를 담을 클래스는 내부적으로 RealmPorxy.java 라는 클래스에서 이를 상속하기 때문에 open으로 선언을 해주어야 합니다. 담을 내용들을 변수로 선언하고 textview2에 표시하기 위해서 toString함수를 override 하였습니다.

 

초기 사용을 위해 MainActivity 에서 Realm.init(this) 을 해준후 사용할 프래그먼트에서 RealmManager를 생성해 줍니다.

이때 생성자에는 생성한 Realm객체를 전달해 주어야 합니다.

5개의 함수를 만들 었는데 각각 해당 항목에 해당하는 데이터를 첫번째꺼/ 모두 찾는 함수

새로운 데이터 삽입 / 해당 데이터 업데이트 / 해당 데이터 모두 삭제 하는 역할을 합니다.

 

기본적으로 데이터를 찾기 위해서는 relam.where(데이터 클래스 이름::class.java). ------- 를 통해서 찾을 수 있고

equalTo를 통해서 찾으려는 데이터의 조건을 추가 할 수 있습니다.

 

Create / update /delete 동작시 realm.beginTransaction() 과 realm.commitTransaction() 사이에서  작업을 진행 해주면 됩니다. 

open class exdata : RealmObject() {

    lateinit var name: String
    lateinit var phone: String
    lateinit var email: String

    override fun toString(): String {
        return "이름:"+name+'\n'+"전화번호:"+phone+'\n'+"이메일:"+email+'\n'
    }

}

class RealmManager(val realm: Realm) {

    fun find(name: String): exdata? {
        return realm.where(exdata::class.java).equalTo("name", name).findFirst()
    }

    fun findAll(): List<exdata> {
        return realm.where(exdata::class.java).findAll()
    }

    fun create(curdata: exdata) {
        realm.beginTransaction()

        val data = realm.createObject(exdata::class.java)
        data.name = curdata.name
        data.phone = curdata.phone
        data.email = curdata.email

        realm.commitTransaction()
    }

    fun update(name: String, curdata: exdata) {
        realm.beginTransaction()
        val data = find(name)
        data?.name = curdata.name
        data?.phone = curdata.phone
        data?.email = curdata.email

        realm.commitTransaction()
    }

    fun deleteByName(name: String) {
        realm.beginTransaction()
        val data = realm.where(exdata::class.java).equalTo("name",name).findAll()
        data.deleteAllFromRealm()
        realm.commitTransaction()
    }
}

이전 게시글에서 만든 first.kt 라는 fragment에 테스트를 위해 아래와 같이 작성하였습니다. 각각 주석을 해제하여 각 기능을 확인 해 볼 수 있습니다.

 

class first : Fragment() {

    lateinit var navController: NavController
    lateinit var realmManager: RealmManager

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        realmManager = RealmManager(Realm.getDefaultInstance())
        return inflater.inflate(R.layout.fragment_first, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        navController = Navigation.findNavController(view)
        val bundle = bundleOf("message" to "i'm from first fragment!")

        //data 생성 및 삽입
        var data1 = exdata()
        data1.name = "huiung"
        data1.phone = "000-0000-0000"
        data1.email = "aaa@aaaaaa.caa"

        realmManager.create(data1)


        //동일 Name의 data 제거
       // realmManager.deleteByName("huiung")


        // 동일 Name의 data 업데이트
//        data1.phone = "change"
//        data1.email = "change"

//        realmManager.update("huiung", data1)


        //해당 name의 data find
        val viewdata = realmManager.find("huiung")

        textview2.text = viewdata.toString()

        textview.setOnClickListener {
            navController.navigate(R.id.action_first2_to_second2, bundle)
        }
    }
}

 

insert 한 경우

 

update 한 경우
delete 한 경우

 


Realm은 Thread safe 하지 않습니다. 따라서 여러 스레드에서 작업을 하는 경우엔 반드시!! realm instance 를 다시 만든다음 작업을 해야 합니다. 위의 예제에서도 RelamManager 객체를 생성 할때마다 새로 생성한 realm instance를 전달해 주어야 합니다. 그렇지 않으면 ACID가 보장되지 않을 수 있습니다.

 

반응형