31158


InMemory Realm を利用したプロジェクトを開発しています。

[code]

    class RealmSampleApplication : Application() {
        /**
         * キャッシュデータ用のRealmオブジェクト
         * アプリケーションクラスで保持する
        */
        lateinit var inMemoryRealm: Realm
    
        companion object {
            lateinit var instance: RealmSampleApplication
        }
    
        init {
            instance = this
        }
    
        override fun onCreate() {
            super.onCreate()
    
            Realm.init(this)
            val config: RealmConfiguration = RealmConfiguration.Builder()
                    .name("inMemory.realm")
                    .inMemory()
                    .build()
            this.inMemoryRealm = Realm.getInstance(config)
            Realm.setDefaultConfiguration(config)
        }
    }
    
[/code]

InMemory Realm の参照を常に持つように Application クラスで定義しているのですが Realm へのアクセスは、通常の Realm
と同様に val realm = Realm.getDefaultInstance() と realm.close() を行うべきでしょうか。

val realm = RealmSampleApplication.instance.inMemoryRealm と Application
クラスの保持している Realm を参照し close を行わないとしたら何か問題がありますか？宜しくお願いします。


CC BY-SA 3.0
2016-12-08T09:37:38.813
31020
2016-12-14T19:16:28.500
19558
question
realm
InMemory Realm を利用する場合も Realm の参照、クローズを毎回行うべきか


InMemoryなRealmの場合、すべてのRealmインスタンスがクローズされた瞬間にデータは全て捨てられてしまうので、データを保持したいあいだは少なくとも１つのRealmインスタンスが残っている必要があります。

カスタムのApplicationクラスを定義して、onCreate()で`Realm.getInstance()`(もしくは`Realm.getDefaultInstance()`)したインスタンスをフィールドに保持させるのがおすすめです。そのうえで、各Activityでは通常のように`getInstance()`/`close()`を行ってください。

注意点としては、非Looperスレッドに保持するのは避けたほうが良いということです。  
というのも、非LooperスレッドのRealmは他のスレッドでデータが変更されても自動的に最新バージョンへの更新が行われないので、そのスレッドでいつまでも古いデータを見続けてしまいます。  
そうすると、古いバージョンから最新バージョンまでのすべてを差分の形で保持しないといけなくなってしまい使用メモリが増大してしまいます。

この点からも、メインスレッドであることが保証されているアプリケーションクラスの `onCreate()` が適しています。


CC BY-SA 3.0
2016-12-14T19:16:28.500
31158
2016-12-14T19:16:28.500
319
31020
answer