Docs Menu
Docs Home
/ /
Atlas Device SDK
/

変更に対応する - React React Native SDK

項目一覧

  • Realm 変更リスナーの登録
  • コレクション変更リスナーの登録
  • オブジェクト変更リスナーの登録
  • すべての変更リスナーを削除
  • 通知制限の変更

Realm のオブジェクトとコレクションは、読み取り時に常にデータの最新状態を反映します。 Realm はデータの状態が変化するたびに変更通知を発行するため、コミットされた書込みトランザクションに応じてアプリをリアクティブに更新できます。

次の 3 種類の通知リスナーを登録できます。

  • Realm 内のすべてのオブジェクトが変更されるたびにRealm リスナーが起動します。

  • コレクション リスナーは、特定のクエリが新しいオブジェクト セットと一致するたび、または一致したオブジェクトが変更されたときに起動されます。

  • オブジェクト リスナーは、特定のオブジェクトが削除されるたび、または 1 つ以上のプロパティが変更されるたびに起動されます。

Realm 全体の変更リスナーを登録するには、コールバック 関数を Realm の addLister()メソッドに渡します。 Realm では、操作によって Realm 内のオブジェクトが追加、変更、または削除されるたびに、非同期にリスナーが呼び出されます。

Realm リスナーを削除するには、コールバックを Realm のdeleteLister()メソッドに渡します。

Tip

変更の詳細のためのオブジェクトとコレクション リスナーの使用

Realm は、Realm リスナーのコールバック関数に変更されたことに関する情報を渡しません。 オブジェクトまたはコレクションの変更に関する詳細情報が必要な場合は、オブジェクト リスナーコレクション リスナー を使用します。

Tip

リスナー内での例外の処理

変更リスナーからスローされた例外を処理するには、addListener() 呼び出しを try...catch 内でラップします。 ステートメント。

// Define a listener callback function
function onRealmChange() {
console.log("Something changed!");
}
// Add the listener callback to the realm
try {
realm.addListener("change", onRealmChange);
} catch (error) {
console.error(
`An exception was thrown within the change listener: ${error}`
);
}
// Remember to remove the listener when you're done!
realm.removeListener("change", onRealmChange);

Realm オブジェクトのコレクションの変更リスナーを登録するには、コレクションのaddLister()メソッドにコールバック 関数を渡します。 Realm は、登録されているとき、および操作によってコレクション内のオブジェクトが追加、変更、または削除されるたびに、非同期にリスナーを呼び出します。

コレクション リスナーを削除するには、コールバックをコレクションのdeleteLister()メソッドに渡します。

重要

順序は重要

コレクション通知ハンドラーでは、削除、挿入、変更の順に常に変更を適用します。 削除前に挿入を処理すると、予期しない動作が発生する可能性があります。

// You can define a listener for any collection of Realm objects
const dogs = realm.objects("Dog");
// Define a listener callback function for changes to any Dog
function onDogsChange(dogs, changes) {
// Handle deleted Dog objects
changes.deletions.forEach((index) => {
// You cannot directly access deleted objects,
// but you can update a UI list, etc. based on the index.
console.log(`Looks like Dog #${index} has left the realm.`);
});
// Handle newly added Dog objects
changes.insertions.forEach((index) => {
const insertedDog = dogs[index];
console.log(`Welcome our new friend, ${insertedDog.name}!`);
});
// Handle Dog objects that were modified
changes.modifications.forEach((index) => {
const modifiedDog = dogs[index];
console.log(`Hey ${modifiedDog.name}, you look different!`);
});
}
// Add the listener callback to the collection of dogs
try {
dogs.addListener(onDogsChange);
} catch (error) {
console.error(
`An exception was thrown within the change listener: ${error}`
);
}
// Remember to remove the listener when you're done!
dogs.removeListener(onDogsChange);

特定の Realm オブジェクトに変更リスナーを登録するには、コールバック 関数をオブジェクトのaddLister()メソッドに渡します。 Realm は、オブジェクトのプロパティのいずれかが変更された場合、またはオブジェクトが誰かが削除された場合にリスナーを呼び出します。

オブジェクト リスナーを削除するには、コールバックをオブジェクトのdeleteLister()メソッドに渡します。

// Define a listener callback function for changes to a specific Dog
function onDogChange(dog, changes) {
if (changes.deleted) {
console.log(`dog is deleted: ${changes.deleted}`);
} else {
changes.changedProperties.forEach((prop) => {
console.log(`* the value of "${prop}" changed to ${dog[prop]}`);
});
}
}
// You can define a listener for any Realm object
try {
dog.addListener(onDogChange);
} catch (error) {
console.error(
`An exception was thrown within the change listener: ${error}`
);
}
// Remember to remove the listeners when you're done!
dog.removeListener(onDogChange);

特定の Realm、オブジェクト、またはコレクション インスタンスのすべてのリスナーを削除するには、インスタンスのremoveAllListeners()関数を呼び出します。

// Remove all listeners from a realm
realm.removeAllListeners();
// Remove all listeners from a collection
dogs.removeAllListeners();
// Remove all listeners from an object
dog.removeAllListeners();

4 レベルよりも深いネストされたドキュメントの変更では、変更通知はtriggerされません。

5 レベル以上の変更をリッスンする必要があるデータ構造がある場合は、次の回避策があります。

  • スキーマをリファクタリングしてネストを減らします。

  • ユーザーがデータを手動で更新できるようにするには、「push-to-refresh」のようなものを追加します。

戻る

クエリ データ