変更に対応する - React React Native SDK
Realm のオブジェクトとコレクションは、読み取り時に常にデータの最新状態を反映します。 Realm はデータの状態が変化するたびに変更通知を発行するため、コミットされた書込みトランザクションに応じてアプリをリアクティブに更新できます。
次の 3 種類の通知リスナーを登録できます。
Realm 内のすべてのオブジェクトが変更されるたびにRealm リスナーが起動します。
コレクション リスナーは、特定のクエリが新しいオブジェクト セットと一致するたび、または一致したオブジェクトが変更されたときに起動されます。
オブジェクト リスナーは、特定のオブジェクトが削除されるたび、または 1 つ以上のプロパティが変更されるたびに起動されます。
Realm 変更リスナーの登録
Realm 全体の変更リスナーを登録するには、コールバック 関数を Realm の addLister()メソッドに渡します。 Realm では、操作によって Realm 内のオブジェクトが追加、変更、または削除されるたびに、非同期にリスナーが呼び出されます。
Realm リスナーを削除するには、コールバックを Realm のdeleteLister()メソッドに渡します。
Tip
変更の詳細のためのオブジェクトとコレクション リスナーの使用
Realm は、Realm リスナーのコールバック関数に変更されたことに関する情報を渡しません。 オブジェクトまたはコレクションの変更に関する詳細情報が必要な場合は、オブジェクト リスナーとコレクション リスナー を使用します。
// 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」のようなものを追加します。