レルムを使用してデータを保存および取得しています。通常、レルムを開いてデータを保存するときは、次のようにします。
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
// Copy the object to Realm
realm.copyToRealm(myObject);
realm.commitTransaction();
realm.close();
上記の場合、私はレルムを閉じています。
しかし、私が次のようなデータを取得しているとき:
RealmResults<MyClass> results = Realm.getDefaultInstance().where(MyClass.class).findAll();
このレルムを閉じるにはどうすればよいですか?閉じる必要がありますか?
ワンライナーとして行うと、レルムを閉じることができないので、反対することをお勧めします。
レルムを閉じないと、最良の場合、メモリリークが発生し、バックグラウンドにある場合にシステムによって強制終了される可能性が高くなります。最悪の場合、Realmは開いているRealmインスタンスのすべてのバージョンを追跡する必要があるため(MVCCデータベースであるため)、ディスク使用量が大幅に増加します。
最初のパターンを使用することを強くお勧めします。レルムインスタンスの制御の詳細については、これを読むことができます: https://realm.io/docs/Java/latest/#realm-instance-lifecycle およびこれ https:// realm.io/news/threading-deep-dive/
Kotlinを使用している場合のみ:Realm.getDefaultInstance().executeTransaction {}
の代わりにこれを使用します:Realm.getDefaultInstance().use {}
Useブロックは、レルムインスタンスを自動的に閉じます。コードは次のとおりです。
/**
* Executes the given [block] function on this resource and then closes it down correctly whether an exception
* is thrown or not.
*
* @param block a function to process this [Closeable] resource.
* @return the result of [block] function invoked on this resource.
*/
@InlineOnly
@RequireKotlin("1.2", versionKind = RequireKotlinVersionKind.COMPILER_VERSION, message = "Requires newer compiler version to be inlined correctly.")
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
var exception: Throwable? = null
try {
return block(this)
} catch (e: Throwable) {
exception = e
throw e
} finally {
when {
apiVersionIsAtLeast(1, 1, 0) -> this.closeFinally(exception)
this == null -> {}
exception == null -> close()
else ->
try {
close()
} catch (closeException: Throwable) {
// cause.addSuppressed(closeException) // ignored here
}
}
}
}