Android - 11 Kotlin 통합 Realm

8659 단어
realm 은 크로스 플랫폼 모 바 일 데이터베이스 엔진 으로 iOS, OS X (Objective - C 와 Swift), Android 를 지원 합 니 다.SQLite 에 비해 Realm 은 빠 르 고 많은 현대 데이터 뱅 크 의 특성 을 가진다. 예 를 들 어 JSON, 스 트림 api, 데이터 변경 알림, 암호 화 지원 등 은 모두 안 드 로 이 드 개발 자 에 게 편 의 를 가 져 다 주 었 다.
다음은 Kotlin 프로젝트 에 Realm 을 통합 하 는 방법 을 살 펴 보 겠 습 니 다.
설치:
Realm 은 Gradle 플러그 인 으로 설치 하려 면 다음 과 같은 두 단계 가 필요 합 니 다.
  • 프로젝트 의 build. gradle 파일 에 다음 class path 의존 도 를 추가 합 니 다
  • buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath "io.realm:realm-gradle-plugin:2.1.1"
        }
    }
    
    
  • app 의 build. gradle 파일 에 realm - android 플러그 인 적용
  • apply plugin: 'realm-android'
    
    

    Realm 데이터 모델 정 의 는 RealmObject 클래스 를 계승 해 야 합 니 다.
    package com.vslimit.kotlindemo.realmobj
    
    import io.realm.RealmObject
    import io.realm.annotations.PrimaryKey
    import io.realm.annotations.RealmClass
    
    /**
     * Created by vslimit on 17/2/4.
     */
    @RealmClass
    open class Book : RealmObject(){
        @PrimaryKey
        open var id:String? = ""
        open var name:String? = ""
        open var author:String? = ""
    }
    
    

    Realm 설정
    우선 App 에 추가 하기:
    Realm.init(this)
    
    

    RealmConfiguration 은 만 들 Realm 의 다양한 기능 을 설정 하 는 데 사 용 됩 니 다.가장 간단 한 설정 은 다음 과 같다.
    RealmConfiguration config = new RealmConfiguration.Builder().build();
    

    위 에서 설정 한 Realm 은 Context. getFilesDir () 에 저장 되 고 default. realm 이 라 고 명 명 됩 니 다.
    나 는 프로젝트 에서 RealmUtil 을 정의 했다.
    package com.vslimit.kotlindemo.util.realm
    
    import io.realm.Realm
    import io.realm.RealmConfiguration
    
    /**
     * Created by vslimit on 16/11/8.
     */
    class RealmUtil() {
        companion object {
            fun instant(): Realm {
                val config = RealmConfiguration.Builder().name("myrealm.realm").schemaVersion(1).migration(Migration.getInstance()).build()
                return Realm.getInstance(config)
            }
        }
    }
    

    데이터베이스 이름 은 my realm 입 니 다.
    Realm 의 인 스 턴 스 는 스 레 드 단일 화 된 것 임 을 주의 하 십시오. 즉, 같은 스 레 드 에서 정적 방법 을 여러 번 호출 하여 같은 경로 에 대한 Realm 를 얻 으 면 같은 Realm 인 스 턴 스 를 되 돌려 줍 니 다.
    프로젝트 를 초기 화 할 때 일부 데 이 터 를 초기 화 해 야 한다 면 먼저 데 이 터 를 my realm 에 삽입 한 다음 에 my realm. realm 을 assets 폴 더 에 넣 고 realm 을 설정 할 때 assetFile ("my realm. realm") 을 추가 할 수 있 습 니 다. 구체 적 인 코드 는 다음 과 같 습 니 다.
    val config = RealmConfiguration.Builder().name("myrealm.realm").schemaVersion(2).migration(Migration.getInstance()).assetFile("myrealm.realm").build()
    

    옮기다
    모든 데이터 베 이 스 는 모델 이 바 뀐 상황 을 처리 해 야 한다.Realm 의 데이터 모델 은 표준 자바 대상 으로 정의 되 며, 데이터 모델 을 바 꾸 려 면 데이터 대상 의 정의 만 바 꾸 면 된다.
    만약 구 Realm 데이터 파일 이 존재 하지 않 는 다 면 코드 의 변 화 는 상응하는 Realm 데이터 파일 의 변화 에 반 영 될 것 이다.그러나 이미 구 버 전의 Realm 데이터 파일 이 존재 한다 면 Realm 은 데이터베이스 파일 을 이전 해 야 한 다 는 이상 알림 을 던 집 니 다.해당 RealmConfiguration 에 schema 버 전과 migration 코드 를 설정 하여 이 이상 을 정확하게 처리 하고 버 리 지 않도록 하 십시오.
    여기 서 Migrate 를 정 의 했 지만 현재 비어 있 습 니 다.
    package com.vslimit.kotlindemo.util.realm;
    
    import io.realm.DynamicRealm;
    import io.realm.RealmMigration;
    import io.realm.RealmSchema;
    
    /**
     * Created by vslimit on 17/1/23.
     */
    public class Migration implements RealmMigration {
    
        private static Migration instance = null;
    
        static {
            instance = new Migration();
        }
    
        private Migration() {
        }
    
        public static Migration getInstance() {
            return instance;
        }
    
        @Override
        public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
            RealmSchema schema = realm.getSchema();
            if (oldVersion == 0) {
                oldVersion++;
            }
    //        if (oldVersion == 1) {
    //            oldVersion++;
    //        }
        }
    }
    
    

    Realm 확장 클래스 RealmExtensions. kt:
    package com.vslimit.kotlindemo.extensions
    
    import io.realm.Realm
    import io.realm.RealmObject
    import io.realm.RealmQuery
    import io.realm.RealmResults
    
    /**
     * Created by Kittinun Vantasin on 10/20/14.
     */
    
    fun  Realm.create(clazz: Class, f: (it: T) -> Unit): T {
        beginTransaction()
        val realmObject = createObject(clazz)
        f(realmObject)
        commitTransaction()
        return realmObject
    }
    
    fun  Realm.create(it: T): T {
        beginTransaction()
        val realmObject = copyToRealm(it)
        commitTransaction()
        return realmObject
    }
    
    fun  Realm.createOrUpdate(it: T): T {
        beginTransaction()
        val realmObject = copyToRealmOrUpdate(it)
        commitTransaction()
        return realmObject
    }
    
    fun  Realm.deleteAll(clazz: Class) {
        beginTransaction()
        val results = where(clazz).findAll()
        results.deleteAllFromRealm()
        commitTransaction()
    }
    
    fun  Realm.delete(clazz: Class, key: String, value: String) {
        beginTransaction()
        val results = where(clazz).equalTo(key, value).findAll()
        results.deleteAllFromRealm()
        commitTransaction()
    }
    
    fun  Realm.query(clazz: Class, conditionMap: Map?): RealmResults {
        val query: RealmQuery = where(clazz)
        if (conditionMap != null) {
            for ((key, value) in conditionMap) {
                query.equalTo(key, value)
            }
        }
        return query.findAll()
    }
    
    fun  Realm.show(clazz: Class,conditionMap: Map?): T {
        val query: RealmQuery = where(clazz)
        if (conditionMap != null) {
            for ((key, value) in conditionMap) {
                query.equalTo(key, value)
            }
        }
        return query.findFirst()
    }
    
    fun  Realm.findAll(clazz: Class): RealmResults {
        return query(clazz, null)
    }
    
    

    다음은 실제 demo 를 살 펴 보 겠 습 니 다. 레이아웃 코드 는 이전의 Textview 와 세 개의 Button 입 니 다.
    package com.vslimit.kotlindemo.fragment
    
    import android.os.Bundle
    import android.util.Log
    import android.view.View
    import com.vslimit.kotlindemo.R
    import com.vslimit.kotlindemo.extensions.*
    import com.vslimit.kotlindemo.realmobj.Book
    import com.vslimit.kotlindemo.util.realm.RealmUtil
    import io.realm.Realm
    import kotlinx.android.synthetic.main.fragment_companys.*
    import org.jetbrains.anko.async
    import org.jetbrains.anko.onClick
    import java.util.*
    import kotlin.properties.Delegates
    
    
    /**
     * Created by vslimit on 16/12/31.
     */
    class BookListFragment : BaseFragment() {
        override val layoutResourceId: Int = R.layout.fragment_companys
    
        var realm: Realm by Delegates.notNull()
    
        companion object {
            fun getInstance(): BookListFragment {
                return BookListFragment()
            }
        }
    
        override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            init()
            showBtn.onClick {
                val book = realm.show(Book::class.java, mapOf("author" to "vslimit"))
                Log.d("BOOK:::", book.name)
                val name = book.name
                async() { nameTv.text = name }
            }
    
            updateBtn.onClick {
                val book = realm.show(Book::class.java, mapOf("author" to "vslimit"))
                book.name = "update name"
                realm.createOrUpdate(book)
            }
    
            insertBtn.onClick {
                val book = Book()
                book.id = UUID.randomUUID().toString()
                book.name = "Kotlin Realm Android"
                book.author = "vslimit"
                realm.create(book)
            }
        }
    
        override fun onResume() {
            super.onResume()
            realm.close()
        }
    
        fun init() {
            realm = RealmUtil.instant()
            val results = realm.findAll(Book::class.java)
            val sizeTxt = "BOOK SIZE:${results.size}"
            async() {
                nameTv.text = sizeTxt
            }
        }
    
        override fun onDestroy() {
            super.onDestroy()
        }
    }
    
    

    여기 서 주의해 야 할 것 은 Realm, RealmObject, RealmResults 인 스 턴 스 는 스 레 드 를 넘 어 사용 할 수 없습니다.
    본 고 는 Kotlin 통합 Realm 에 대해 간단 한 소 개 를 했 을 뿐 더 많은 내용 은 공식 문 서 를 보십시오. 전송 문
    마지막 으로 공식 적 인 한 마디 를 인용 했다. Realm 은 Kotlin 언어 를 완전히 호 환 하지만 주의해 야 할 부분 이 있다.
  • 당신 의 모델 류 는 개방 적 이 어야 합 니 다 (open).
  • 컴 파일 이 통 과 될 수 있 도록 주 해 를 추가 해 야 할 수도 있 습 니 다.이것 은 현재 Kotlin 주해 프로세서 의 제한 때 문 입 니 다.
  • 많은 리 얼 엠 API 가 자바 클래스 를 인용 했다.컴 파일 의존 에 org. jetbrains. kotlin: kotlin - reflect: ${kotlin version} 을 추가 해 야 합 니 다.

  • 이 글 의 모든 코드 는 git 에 제출 되 었 습 니 다. 마음 에 드 시 면 git 에서 star 로 내 려 가세 요.
    Realm 코드 참조:https://github.com/vslimit/kotlindemo

    좋은 웹페이지 즐겨찾기