Android - 11 Kotlin 통합 Realm
다음은 Kotlin 프로젝트 에 Realm 을 통합 하 는 방법 을 살 펴 보 겠 습 니 다.
설치:
Realm 은 Gradle 플러그 인 으로 설치 하려 면 다음 과 같은 두 단계 가 필요 합 니 다.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:2.1.1"
}
}
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 언어 를 완전히 호 환 하지만 주의해 야 할 부분 이 있다.
이 글 의 모든 코드 는 git 에 제출 되 었 습 니 다. 마음 에 드 시 면 git 에서 star 로 내 려 가세 요.
Realm 코드 참조:https://github.com/vslimit/kotlindemo
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.