CRUD - 更新 - React Native SDK
このページの例では、次のスキーマを使用します。
class Task extends Realm.Object { static schema = { name: 'Task', properties: { _id: 'int', name: 'string', priority: 'int?', progressMinutes: 'int?', assignee: 'Person?', }, primaryKey: '_id', }; }
class Task extends Realm.Object<Task> { _id!: number; name!: string; priority?: number; progressMinutes?: number; assignee?: Person; age?: number; static schema: ObjectSchema = { name: 'Task', properties: { _id: 'int', name: 'string', priority: 'int?', progressMinutes: 'int', assignee: 'Person?', }, primaryKey: '_id', }; }
オブジェクトの更新
Realm オブジェクトのプロパティは、他の JavaScript オブジェクトをアップデートするのと同じ方法で追加、変更、または削除できます。 ただし、書込みトランザクション内で実行する必要があります。
TaskItem
コンポーネントの次の例では、次のようにします。
コンポーネント内で
useRealm()
フックを呼び出して、開いた Realm インスタンスにアクセスします。タスクを取得するには、「Task」とコンポーネントの
_id
パラメータを指定してuseObject()
を呼び出します。書込みトランザクションを実行し、タスクの
progressMinutes
を増加させるコンポーネント メソッドincrementTaskProgress()
を作成します。UI でタスクの
name
とprogressMinutes
をレンダリングします。onPres を追加する
incrementTaskProgress()
を呼び出す「増分」ボタンのイベント。
const TaskItem = ({_id}) => { const realm = useRealm(); const myTask = useObject(Task, _id); const incrementTaskProgress = () => { if (myTask) { realm.write(() => { myTask.progressMinutes += 1; }); } }; if (myTask) { return ( <> <Text>Task: {myTask.name}</Text> <Text>Progress made (in minutes):</Text> <Text>{myTask.progressMinutes}</Text> <Button onPress={() => incrementTaskProgress()} title='Increment Task Progress' /> </> ); } else { return <></>; } };
const TaskItem = ({_id}: {_id: number}) => { const realm = useRealm(); const myTask = useObject(Task, _id); const incrementTaskProgress = () => { if (myTask) { realm.write(() => { myTask.progressMinutes! += 1; }); } }; if (myTask) { return ( <> <Text>Task: {myTask.name}</Text> <Text>Progress made (in minutes):</Text> <Text>{myTask.progressMinutes}</Text> <Button onPress={() => incrementTaskProgress()} title='Increment Task Progress' /> </> ); } else { return <></>; } };
Tip
関連オブジェクトと埋め込みオブジェクトの更新
埋め込みオブジェクト または 関連オブジェクト のプロパティを更新するには、 ドット表記 または 括弧表記 で プロパティを変更します。 : 通常のネストされたオブジェクト内であるかのようにします。
オブジェクトのアップサート
書込みトランザクション内でオブジェクトをアップサートするには、更新モードをmodified
に設定してRealm.create()を呼び出します。 この操作では、指定されたプライマリキーを持つ新しいオブジェクトを挿入するか、そのプライマリキーをすでに持っている既存のオブジェクトを更新します。
注意
アップサートには Realm.create() が必要です
オブジェクトをアップサートするには、書込みトランザクション内でRealm.create()
を呼び出す必要があります。 これは、新しい Realm オブジェクト を呼び出して 新しい Realm オブジェクトを作成することとは異なります。 演算子。
次のCreateTaskItem
コンポーネントの例では、次のことが行われます。
コンポーネント内で
useRealm()
フックを呼び出して、開いた Realm インスタンスにアクセスします。書込みトランザクションを実行し、
_id
値が1234
であるTask
オブジェクトを作成します。書込みトランザクション内で
Realm.create()
を呼び出し、同じ_id
と異なる ``progressMinutes`` と更新モードを "modified" に設定して、Task
オブジェクトをアップサートします。UI でタスクの
name
とprogressMinutes
をレンダリングし、変更の進行状況を表示します。
const CreateTaskItem = () => { const realm = useRealm(); let myTask; realm.write(() => { // Add a new Task to the realm. Since no task with ID 1234 // has been added yet, this adds the instance to the realm. myTask = realm.create( 'Task', {_id: 1234, name: 'Wash the car', progressMinutes: 0}, 'modified', ); // If an object exists, setting the third parameter (`updateMode`) to // "modified" only updates properties that have changed, resulting in // faster operations. myTask = realm.create( 'Task', {_id: 1234, name: 'Wash the car', progressMinutes: 5}, 'modified', ); }); return ( <> <Text>{myTask.name}</Text> <Text>Progress made (in minutes):</Text> <Text>{myTask.progressMinutes}</Text> </> ); };
const CreateTaskItem = () => { const realm = useRealm(); const myTask: Realm.Object = realm.write(() => { // Add a new Task to the realm. Since no Task with ID 1234 // has been added yet, this adds the instance to the realm. realm.create( 'Task', {_id: 1234, name: 'Wash the car', progressMinutes: 0}, 'modified', ); // If an object exists, setting the third parameter (`updateMode`) to // "modified" only updates properties that have changed, resulting in // faster operations. return realm.create( 'Task', {_id: 1234, name: 'Wash the car', progressMinutes: 5}, 'modified', ); }); return ( <> <Text>{myTask.name}</Text> <Text>Progress made (in minutes):</Text> <Text>{myTask.progressMinutes}</Text> </> ); };
コレクションの一括更新
オブジェクトのコレクションにアップデートを適用するには、コレクションに対して反復処理(例: の )。ループ内で、各オブジェクトを個別に更新します。
TaskDashboard
コンポーネントの次の例では、次のことが行われます。
コンポーネント内で
useRealm()
フックを呼び出して、開いた Realm インスタンスにアクセスします。Realm インスタンス内のすべてのタスクを取得するには、
Task
をuseQuery()
フックに渡します。書込みトランザクションを実行するコンポーネント メソッド
resetProgressOnAllTasks()
を作成します。 その書き込みトランザクション内では、for...of
を使用してループ処理を行い、progressMinutes
を 0 に設定して、すべてのタスクを一括更新します。マップ タスクを介して コンポーネントのリストがレンダリングされ、各タスクの
Text
name
とprogressMinutes
が表示されます。
const TaskDashboard = () => { const realm = useRealm(); const tasks = useQuery(Task); const resetProgressOnAllTasks = () => { realm.write(() => { for (const task of tasks) { task.progressMinutes = 0; } }); }; return ( <> {tasks.map(task => { <Text> {task.name} has {task.progressMinutes} minutes progressed </Text>; })} <Button onPress={resetProgressOnAllTasks} title='Reset Progress' /> </> ); };