記事のディレクトリ
文書を使用して、レルム(Java)のデータベース(ディレクトリ)
レルムは、モバイルデバイスのデータベースの一例です。レルムは、ローカルまたは同期させることができます。レルム同期使用レルムオブジェクト・サーバは透過的に他のデバイスとその内容を同期させます。あなたのアプリケーションは、ローカルファイルとして同期レルムを引き続き使用する場合は、データのレルムは、レルムへの書き込みアクセス権を持つ任意のデバイスを更新することができます。実際には、あなたのアプリケーションは、同じレルムローカルまたは任意の同期で動作することができます。
あなたはすべてのレルムrealmデータベースを同期するために、モバイルデバイスを使用するかどうか?
同期に関連するすべての文書は、当社のプラットフォームのドキュメントに移動されました
レルムのより詳細な議論については、読んでくださいレルムデータモデルを。
2.1初期化
新しいインスタンス化することによってRealm
、オープンレルムのオブジェクトを。私たちは、この使用例で見てきました:
// 初始化Realm
Realm.init(context);
// 获取此线程的Realm实例
Realm realm = Realm.getDefaultInstance();
getDefaultInstance()
デフォルトの使用方法RealmConfiguration
レルムの構成例を。
2.1.1レルム構成
制御された方法レルムを作成するには、RealmConfigurationオブジェクトを使用します。レルム最も基本的な構成は以下の通り:
RealmConfiguration config = new RealmConfiguration.Builder().build();
(オプションなし)この設定を使用する位置Context.getFilesDir
レルムファイルdefault.realm
。異なる構成を使用するには、新しい作成する必要があるRealmConfiguration
ターゲットを:
// 使用构建器模式创建RealmConfiguration。
// Realm文件将位于Context.getFilesDir()中,名称为“ myrealm.realm”
RealmConfiguration config = new RealmConfiguration.Builder()
.name("myrealm.realm")
.encryptionKey(getKey())
.schemaVersion(42)
.modules(new MySchemaModule())
.migration(new MyMigration())
.build();
// 使用配置
Realm realm = Realm.getInstance(config);
あなたが独立王国のそれぞれのバージョン、アーキテクチャおよび位置を制御することができますので、あなたは、複数のRealmConfigurationオブジェクトを持つことができます。
RealmConfiguration myConfig = new RealmConfiguration.Builder()
.name("myrealm.realm")
.schemaVersion(2)
.modules(new MyCustomSchema())
.build();
RealmConfiguration otherConfig = new RealmConfiguration.Builder()
.name("otherrealm.realm")
.schemaVersion(5)
.modules(new MyOtherSchema())
.build();
Realm myRealm = Realm.getInstance(myConfig);
Realm otherRealm = Realm.getInstance(otherConfig);
使用して、Realm.getPath
フィールドを取得するために、絶対パスを。
ことに注意することが重要であるRealm
例では、スレッドのシングルトンである静的コンストラクタは、指定されたスレッドからのすべての呼び出しに応答する同じインスタンスを返すことを意味します。
2.2.2デフォルトのレルム
あなたはできるRealmConfiguration
、デフォルトの設定を保存します。カスタムでは、アプリケーションの設定、デフォルトのクラスコンフィギュレーションアプリケーション全体で使用できるようにします。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 默认的Realm文件在Context.getFilesDir();中为“ default.realm”;
// 我们将其更改为“ myrealm.realm”
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder().name("myrealm.realm").build();
Realm.setDefaultConfiguration(config);
}
}
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Realm realm = Realm.getDefaultInstance(); // 打开“ myrealm.realm”
try {
// ... Do something ...
} finally {
realm.close();
}
}
}
2.2オープニング同期レルム
あなたはすべてのレルムrealmデータベースを同期するために、モバイルデバイスを使用するかどうか?
同期に関連するすべての文書は、当社のプラットフォームのドキュメントに移動されました
2.3読み取り専用レルム
リードオンリーのみ、現在のプロセスに施行。他のプロセスやデバイスが書き込みをすることが可能ですリードオンリーレルム。また、任意の書き込みトランザクションのために読み取り専用のレルムがスローされますIllegalStateExceptionが。これは、書き込みモードにしようと含まれているため、最初は他のソースによって提供されなければなりません。
それはあなたのアプリケーションと便利な場合には準備ができてレルムファイルを来る - あなたのデータと一緒にバンドルされたアプリケーションの一部を共有することができます。多くの場合、誤ったデータが読み取り専用である純粋なので、レルムを変更する必要はありません。あなたは資産にレルムファイルをバンドルし、これを行うには、読み取り専用の設定を使用することができます。
RealmConfiguration config = new RealmConfiguration.Builder()
.assetFile("my.realm")
.readOnly()
// 可选的,但是建议创建一个模块来描述捆绑文件中的类。 否则,如果您的App包含文件中找不到的其他类,则由于无法以只读模式更新架构,因此在打开Realm时它将崩溃。
.modules(new BundledRealmModule())
.build();
2.4メモリレルム
使用しinMemory
た構成では、あなたは完全にメモリ内でディスクの実行にかなり永続的なレルムを作成することができます。
RealmConfiguration myConfig = new RealmConfiguration.Builder()
.name("myrealm.realm")
.inMemory()
.build();
メモリ不足場合は、レルムのメモリは、まだディスク領域を使用することがありますが、レルムを閉じたときレルムのメモリで作成されたすべてのファイルが削除されます。まだ一意である必要があり、同じ名前Realm-レルム名を使用して永続的なメモリを作成することができました。
場合スコープと参照データから逸脱することなく、特定の名前の全てのメモリレルムインスタンスはすべてのレルムを放出します。アプリケーション全体の実行の過程で「アクティブ」のメモリを維持するために、それへの参照を保持してください。
2.5ダイナミック・レルム - DynamicRealm
従来ではRealm
使用している場合RealmObject
、サブクラス定義モデルクラスを。多くの利点があり、セキュリティの種類、程度。しかし、時には、これらのタイプは、実行している場合のみ、例えば、移行またはCSVファイルベースのデータ列の間に、あなたがDynamicRealmを使用することができます利用可能です!
DynamicRealmは従来のレルムの変異体であり、それはレルム使用せずにデータを使用することができるRealmObject
サブクラス。しかし、直接使用する文字列の代わりに、クラスは、すべてのアクセスを完了します。
従来のレルムを使用して、同じ設定DynamicRealmを開き、しかしDynamicRealmは、任意の構成アーキテクチャ、遊走およびスキーマバージョンを無視します。
RealmConfiguration realmConfig = new RealmConfiguration.Builder().build();
DynamicRealm realm = DynamicRealm.getInstance(realmConfig);
// 在DynamicRealm中,所有对象都是DynamicRealmObjects
realm.beginTransaction();
DynamicRealmObject person = realm.createObject("Person");
realm.commitTransaction();
// 使用字符串访问所有字段
String name = person.getString("name");
int age = person.getInt("age");
// 基础架构仍然存在,因此访问不存在的字段将引发异常
person.getString("I don't exist");
// 查询仍然可以正常工作
RealmResults<DynamicRealmObject> persons = realm.where("Person")
.equalTo("name", "John")
.findAll();
DynamicRealm
柔軟性とパフォーマンスの向上、柔軟性を犠牲にして。一般的には、従来のレルムを使用する必要があります。あなたはこのような柔軟性を必要とするときDynamicRealmにのみ使用しました。
2.6閉じるレルム
Realm
実装Closeable
プロセスにネイティブファイルディスクリプタのメモリを再配布するため、インスタンス後レルムの使用、それらを閉じてください。
Realm
例としては、参照カウントされます-あなたがスレッドで二回呼び出す場合getInstance
、あなたは、2つのコールを必要としますclose
。これは、あなたが実装することができますRunnable
だけに:スレッドがそれらを実行しますこれを気にすることなくクラスをgetInstance
始めとするclose
缶の終わり。
UIスレッドでは、最も簡単な方法は、コンポーネント持つことですonDestroy()
実行方法をrealm.close
。あなたはUIの外に作成する必要がある場合Looper
、スレッドは、次のモードを使用することができます。
public class MyThread extends Thread {
private Realm realm;
@Override
public void run() {
Looper.prepare();
realm = Realm.getDefaultInstance();
try {
//... 使用Realm实例设置处理程序 ...
Looper.loop();
} finally {
realm.close();
}
}
}
以下のためにAsyncTask
、これは良いモデルです。
protected Void doInBackground(Void... params) {
Realm realm = Realm.getDefaultInstance();
try {
// ... Use the Realm instance ...
} finally {
realm.close();
}
return null;
}
あなたが使用している場合Thread
やRunnable
、短期的なタスクのために:
// Run a non-Looper thread with a Realm instance.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Realm realm = Realm.getDefaultInstance();
try {
// ... Use the Realm instance ...
} finally {
realm.close();
}
}
});
thread.start();
使用している場合minSdkVersion> = 19
やJava> = 7
アプリケーションを、あなたは、try-と資源を使用することができます。
try (Realm realm = Realm.getDefaultInstance()) {
// 无需手动关闭Realm实例
}
2.7オートリフレッシュ
場合ルーパーレルムのインスタンスはスレッドに関連付けられます、レルムのインスタンスは、オートリフレッシュ機能を持っています。(AndroidのUIスレッドはルーパーである。)この手段レルム・インスタンスは、定期的に最新バージョンに更新されること。これは、あなたは常にUI更新された最新のコンテンツに簡単にできます!
あなたが添付したことがない場合はLooper
、スレッドが呼び出しで、レルムのインスタンスを取得するwaitForChange
メソッドの前に、この例では、オブジェクトが更新されません。データの古いバージョンを保持メモリとディスクスペースの面で非常に高価であり、およびバージョン数がバージョンと最新バージョンの間に保持として増加し、コストが増加します。それはすぐにレルムインスタンスのスレッドが完了した後シャットダウンに非常に重要な理由である理由です。
あなたのレルムのインスタンスが自動的にリフレッシュ有効かどうかを確認するには、使用isAutoRefresh
方法を。