Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

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コンポーネントの次の例では、次のようにします。

  1. コンポーネント内でuseRealm()フックを呼び出して、開いた Realm インスタンスにアクセスします。

  2. タスクを取得するには、「Task」とコンポーネントの_idパラメータを指定してuseObject()を呼び出します。

  3. 書込みトランザクションを実行し、タスクのprogressMinutesを増加させるコンポーネント メソッドincrementTaskProgress()を作成します。

  4. UI でタスクのnameprogressMinutesをレンダリングします。

  5. 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コンポーネントの例では、次のことが行われます。

  1. コンポーネント内でuseRealm()フックを呼び出して、開いた Realm インスタンスにアクセスします。

  2. 書込みトランザクションを実行し、 _id値が1234であるTaskオブジェクトを作成します。

  3. 書込みトランザクション内でRealm.create()を呼び出し、同じ_idと異なる ``progressMinutes`` と更新モードを "modified" に設定して、 Taskオブジェクトをアップサートします。

  4. UI でタスクのnameprogressMinutesをレンダリングし、変更の進行状況を表示します。

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コンポーネントの次の例では、次のことが行われます。

  1. コンポーネント内でuseRealm()フックを呼び出して、開いた Realm インスタンスにアクセスします。

  2. Realm インスタンス内のすべてのタスクを取得するには、 TaskuseQuery()フックに渡します。

  3. 書込みトランザクションを実行するコンポーネント メソッドresetProgressOnAllTasks()を作成します。 その書き込みトランザクション内では、 for...ofを使用してループ処理を行い、 progressMinutesを 0 に設定して、すべてのタスクを一括更新します。

  4. マップ タスクを介して コンポーネントのリストがレンダリングされ、各タスクのTextnameprogressMinutes が表示されます。

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'
/>
</>
);
};

戻る

読み取り