오늘도 더 나은 코드를 작성하였습니까?

Realms init(초기화) 본문

Android Realm

Realms init(초기화)

hik14 2021. 2. 17. 17:51

Application 서브 클래스 및 Activity 서브 클래스중 상황에 맞춰 필요한 생명주기 메소드(예 onCreate() ) 내부에서 초기화 한다.

 

1.  default 초기화.

// Initialize Realm
Realm.init(context)

// Get a Realm instance for this thread
val realm = Realm.getDefaultInstance()

 

2.  realm 구성(configuring)하기 

 

기본 구성하기.

val config = RealmConfiguration.Builder().build()

옵션과 구성하기.

// the builder pattern을 사용한다.
// The Realm file(db)의 위치는 text.getFilesDir()
// with name "myrealm.realm"

val config = RealmConfiguration.Builder()
    .name("myrealm.realm")
    .encryptionKey(getMyKey())
    .schemaVersion(42)
    .modules(MySchemaModule())
    .migration(MyMigration())
    .build()
    
// Use the config
val realm = Realm.getInstance(config)

 

* RealmConfiguration 객체를 여러 개 가질 수 있으므로 각 Realm의 버전, 스키마 및 위치를 독립적으로 제어 할 수 있습니다.

val myConfig = RealmConfiguration.Builder()
    .name("myrealm.realm")
    .schemaVersion(2)
    .modules(MyCustomSchema())
    .build()

val otherConfig = RealmConfiguration.Builder()
    .name("otherrealm.realm")
    .schemaVersion(5)
    .modules(MyOtherSchema())
    .build()

val myRealm = Realm.getInstance(myConfig)
val otherRealm = Realm.getInstance(otherConfig)

* Realm.getPath를 사용하여 Realm의 절대 경로 가져올수있다.

* Realm 인스턴스는 스레드 싱글 톤이라는 점에 유의해야합니다.

Realm의 정적 생성자가 스레드의 realm 요청에 대한 응답으로 동일한 인스턴스를 반환한다는 것을 의미합니다.

 

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        // The default Realm file is "default.realm" in Context.getFilesDir();
        // we'll change it to "myrealm.realm"
        Realm.init(this)
        // 이름만 옵션을 줌
        val config = RealmConfiguration.Builder().name("myrealm.realm").build()
        Realm.setDefaultConfiguration(config)
    }
}

class MyActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        val realm = Realm.getDefaultInstance() // opens "myrealm.realm"
        
        try {
            // ... Do something ...
        } finally {
            realm.close()
        }
        
    }
}

 

3.  Realm 닫기

 

Realm은 네이티브 native memory deallocation and file descriptors 를 관리 위해 C

loseable을 구현하므로 작업이 끝나면 항상 Realm 인스턴스를 닫아주어야 한다.

 

Realm 인스턴스는 참조 횟수로 계산됩니다.

Thread에서 getInstance를 두 번 호출하면 close 도 두 번 호출해야합니다.

이를 통해 실행될 스레드에 대해 걱정할 필요없이 Runnable 클래스를 구현할 수 있습니다.

간단히 getInstance로 시작하고 close로 종료하면됩니다.

 

UI 스레드의 경우 가장 쉬운 방법은 소유 구성 요소의 onDestroy 메서드에서 realm.close를 실행하는 것입니다.

UI 이외의 Looper 스레드를 만들어야하는 경우 다음 패턴을 사용할 수 있습니다.

 

class MyThread : Thread() {

    private var realm: Realm? = null

    override fun run() {
        Looper.prepare()
        realm = Realm.getDefaultInstance()
        try {
            //... Setup the handlers using the Realm instance ...
            Looper.loop()
        } finally {
            realm?.close()
        }
    }
}

 

4. 새로고침

 

Looper와 관련된 스레드에서 Realm 인스턴스를 얻는 경우 Realm 인스턴스에는 자동 새로 고침 기능이 함께 제공됩니다. (Android의 UI 스레드는 루퍼입니다.) 이는 Realm 인스턴스가 주기적으로 최신 버전으로 업데이트된다는 것을 의미합니다.

이를 통해 거의 노력하지 않고 최신 콘텐츠로 UI를 지속적으로 업데이트 할 수 있습니다!

Looper가 연결되지 않은 스레드에서 Realm 인스턴스를 가져 오면 해당 인스턴스의 객체는 waitForChange 메서드를 호출 할 때까지 업데이트되지 않습니다. 

 

이전 버전의 데이터를 보유하는 것은 메모리 및 디스크 공간 측면에서 비용이 많이 들고 유지되는 버전과 최신 버전 사이의 버전 수에 따라 비용이 증가합니다. 이것이 스레드에서 작업을 마치 자마자 Realm 인스턴스를 닫는 것이 중요한 이유입니다.

Realm 인스턴스에 자동 새로 고침이 활성화되어 있는지 확인하려면 isAutoRefresh 메소드를 사용

'Android Realm' 카테고리의 다른 글

Realm (In-Memory Realms)  (0) 2022.11.18
Realm models  (0) 2021.02.17
Realm 이란?  (0) 2021.02.16