文書を使用して、レルム(Java)のデータベース(ディレクトリ)
そして、読み取り操作は、異なるレルムは、トランザクション内に充填する必要があります書き込みます。書き込み動作が終了するには、トランザクションを提出するか、トランザクションを取り消すことができます。トランザクションは(レルムが同期されている場合、それはレルムオブジェクトサーバーとの同期のためにキューイングされる)ディスクに書き込まれたすべての変更に提出されます。あなたが書き込みトランザクションをキャンセルした場合は、すべての変更が破棄されます。トランザクションは、「オール・オア・ナッシング」ではありません:すべての書かれたトランザクションが成功している、あるいは誰が動作しません。これは、データの一貫性を確保し、スレッドの安全性を提供するのに役立ちます。
// 获取一个Realm实例
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
//... 在此处添加或更新对象 ...
realm.commitTransaction();
またはトランザクションをキャンセルして変更を破棄:
realm.beginTransaction();
User user = realm.createObject(User.class);
// ...
realm.cancelTransaction();
書き込みトランザクションがお互いをブロックします。あなたはまた、UIやバックグラウンドスレッドで書き込みトランザクションを作成した場合、それはANRエラーにつながる可能性があります。あなたが使用してUIスレッドに書き込みトランザクションを作成するときに、このような状況を回避するには、非同期トランザクションを。
例外がトランザクションで発生した場合は、トランザクションで変更を失うことになりますが、レルム自身が影響を受けた(または破損)されていません。異常所見とアプリケーションは引き続き実行された場合は、トランザクションをキャンセルする必要があります。あなたが使用している場合はexecuteTransactionを、それが自動的に行われます。
書き込みトランザクションを開くときMVCCアーキテクチャのレルムでは、ストップ読んでいないだろう。あなたは、同時に複数のスレッドからのトランザクションを実行する必要があるか、よりきめ細かい多くの事柄よりも処理する大規模なトランザクションでの作業に選択することができない限り。あなたが書き込みレルムにトランザクションを送信すると、レルムの他のすべてのインスタンスが通知され、自動的に更新します。
読み取りおよび書き込みアクセスのレルムACID。
7.1オブジェクトを作成するには
ライト・トランザクションにパッケージ方法のCREATEOBJECT。
realm.beginTransaction();
User user = realm.createObject(User.class); // 创建一个新对象
user.setName("John");
user.setEmail("[email protected]");
realm.commitTransaction();
あなたが最初のオブジェクトのインスタンスを作成し、copyToRealmがレルムに追加使用する場合は、トランザクション内の包装作業をコピーする必要があります。レルムのサポートなど長いものがあるとして、カスタムコンストラクタの任意の数の、一般的な引数なしのコンストラクタをすることができます。
User user = new User("John");
user.setEmail("[email protected]");
// 将对象复制到Realm。 任何进一步的更改都必须在realmUser上发生
realm.beginTransaction();
User realmUser = realm.copyToRealm(user);
realm.commitTransaction();
オブジェクトレルムは管理オブジェクト(ユーザー)最初の複製せずに、(この例ではrealmUser)返さ管理し、覚えておいてください。データベース内のオブジェクトを変更するには、代わりに元のコピーで、コピーが返される変更。
むしろすぐマネージドコピーを使用するよりも、関心のオブジェクトを挿入するだけならば、あなたは使用することができますinsert
。これは、copyToRealm
彼らは、オブジェクトがより最適化することができます返さないので、作業のやり方に似てますが、より速く。
あなたは多くのオブジェクトを挿入したい場合は、推奨される方法は、使用するのですinsert
かinsertOrUpdate
。
List<User> users = Arrays.asList(new User("John"), new User("Jane"));
realm.beginTransaction();
realm.insert(users);
realm.commitTransaction();
7.2貿易ブロック
あなたは使用することができますexecuteTransactionの代わりに手動追跡する方法をbeginTransaction,commitTransaction
とcancelTransaction
方法が自動的に開始/コミット処理され、エラーが発生したときに解除されます。
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
User user = realm.createObject(User.class);
user.setName("John");
user.setEmail("[email protected]");
}
});
7.3非同期トランザクション
トランザクションが他のトランザクションによってブロックされているので、あなたは、UIスレッドをブロックを回避するためにバックグラウンドスレッドで書き込みをする必要があるかもしれませんので。非同期トランザクションを使用することにより、レルムは、バックグラウンドスレッドでトランザクションを実行します。
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm bgRealm) {
User user = bgRealm.createObject(User.class);
user.setName("John");
user.setEmail("[email protected]");
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
// Transaction was a success.
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
// Transaction failed and was automatically canceled.
}
});
OnSuccess
そして、OnError
コールバックはオプションですが、提供された場合、トランザクションが成功したか失敗したとき、それぞれ、それらを呼び出すために。でコールバックLooper
制御、したがってのみルーパ糸にコールバックすることができます。
RealmAsyncTask transaction = realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm bgRealm) {
User user = bgRealm.createObject(User.class);
user.setName("John");
user.setEmail("[email protected]");
}
}, null);
あなたが活動を終了する必要がある場合は、トランザクションが完了する前に/フラグメントは、RealmAsyncTaskオブジェクトが処理すべき取引をキャンセルすることができます。コールバック更新UIた場合、クラッシュするアプリケーションを引き起こす可能性があり、取引をキャンセルするのを忘れました!
public void onStop () {
if (transaction != null && !transaction.isCancelled()) {
transaction.cancel();
}
}
7.4文字列やバイト配列バイト配列を更新します
レルムので、フィールドを横切って実行され、従って、直接文字列やバイト配列の個々の要素を更新しません。代わりに、あなたは、修正するために、個々の要素のフィールド全体を読み、[トランザクションブロックにそれを書き戻す必要があります。
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
bytes[] bytes = realmObject.binary;
bytes[4] = 'a';
realmObject.binary = bytes;
}
});
7.5バッチ更新
あなたがオブジェクトの数を更新する必要がある場合は、最も効果的な方法は、オブジェクトを検索し、Xは、更新したいフィールドの型であるRealmResults.setX()メソッドのいずれかを使用してクエリを実行することです。
// Updating a boolean field
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmResults<Person> persons = realm.where(Person.class).equalTo("invited", false).findAll();
persons.setBoolean("invited", true);
}
});
使用はまた、と呼ばれることもRealmResults.setValue(String fieldName,Object value)
、自動的に入力して、適切な変換を行うの種類を検出する方法の共通セット、。これは、に似ているDynamicRealmObject.setX()
とDynamicRealmObject.setValue()
行動。使用RealmResults.setValue()
スローするために使用される方法の特定の種類の比率を。
// Updating a boolean field using automatic input conversion as needed.
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmResults<Person> persons = realm.where(Person.class).equalTo("invited", false).findAll();
persons.setValue("invited", "true");
}
});
このようなフィールドは、オブジェクトに直接更新することができます。リンク・フィールドまたはリスト要素は更新にこれらのメソッドを使用することはできません。