Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/ /

CRUD — 更新 — React Native SDK

在此页面上

  • 更新对象
  • 更新或插入(upsert)对象
  • 批量更新集合

本页中的示例使用以下模式:

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',
};
}

您可以像更新任何其他 JavaScript 对象那样添加、修改或删除 Realm 对象的属性。但是,您必须在写事务内执行这些操作。

在以下 TaskItem 组件示例中,我们:

  1. 通过调用该组件中的 useRealm() 挂钩来访问打开的 Realm 实例。

  2. 使用“Task”(任务)以及该组件的 _id 参数来调用 useObject(),从而检索任务。

  3. 创建组件方法 incrementTaskProgress(),用于执行写事务并递增任务的 progressMinutes

  4. 在用户界面中呈现任务的 nameprogressMinutes

  5. 添加 onPress 调用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 <></>;
}
};

提示

更新相关对象和嵌入式对象

要更 嵌入式对象相关对象的属性,则使用点符号或括号符号修改该属性,就像在常规嵌套对象中一样。

要在写事务中更新或插入对象,请调用Realm.create()并将更新模式设置为modified 。 该操作要么插入具有给定主键的新对象,要么更新已具有该主键的现有对象。

注意

Upsert 操作需使用 Realm.create()

必须在写事务中调用 Realm.create() 来更新或插入对象。这与通过调用操作符创建新的“Realm 对象”不同。

在以下 CreateTaskItem 组件示例中,我们:

  1. 通过调用该组件中的 useRealm() 挂钩来访问打开的 Realm 实例。

  2. 执行写事务并创建一个 Task 对象,且该对象的 _id 值为 1234

  3. 在此写事务中调用 Realm.create(),从而通过指定相同的 _id 和不同的“progressMinutes”并将更新模式设为“已修改”来更新或插入 Task 对象。

  4. 在用户界面中呈现任务的 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>
</>
);
};

如需对对象集合应用更新,需要遍历该集合(例如使用 for...of)。在循环中逐个更新每个对象。

在以下 TaskDashboard 组件示例中,我们:

  1. 通过调用该组件中的 useRealm() 挂钩来访问打开的 Realm 实例。

  2. 通过将 Task 传递给 useQuery() 钩子来检索 Realm 实例中的所有任务。

  3. 创建用于执行写事务的组件方法 resetProgressOnAllTasks()。在该写事务中,通过使用 for...of 来循环遍历所有任务并将这些任务的 progressMinutes 设为 0,从而批量更新所有任务。

  4. 地图 通过任务呈现Text 组件列表,其中显示每个任务的nameprogressMinutes

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

后退

读取