Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
CRUD

CRUD - Update - React Native SDK

The examples on this page use the following schema:

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

Puede agregar, modificar o eliminar propiedades de un objeto Realm de la misma manera que actualizaría cualquier otro objeto JavaScript. Pero debes hacerlo dentro de una transacción de escritura.

En el siguiente ejemplo de un TaskItem componente, nosotros:

  1. Obtenga acceso a la instancia del reino abierto llamando al gancho useRealm() dentro del componente.

  2. Retrieve a task by calling useObject() with "Task" and the _id parameter of the component.

  3. Create a component method incrementTaskProgress() that performs a write transaction and increments the task's progressMinutes.

  4. Renderizar el name y el progressMinutes de la tarea en la Interfaz de Usuario.

  5. Añadir un onPressevento en el botón "incrementar" que llama incrementTaskProgress() a.

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

Actualizar objetos relacionados y incrustados

To update a property of an embedded object or a related object, modify the property with dot-notation or bracket-notation as if it were in a regular, nested object.

Para la inserción de un objeto dentro de una transacción de escritura, llama a Realm.create() con el modo de actualización establecido en modified. La operación inserta un nuevo objeto con la llave primaria proporcionada o actualiza un objeto existente que ya tiene esa llave primaria.

Nota

Upserting Requires Realm.create()

You must call Realm.create() within a write transaction to upsert an object. This is different than creating a new Realm Objects by calling the new operator.

En el siguiente ejemplo de un componente de CreateTaskItem:

  1. Obtenga acceso a la instancia del reino abierto llamando al gancho useRealm() dentro del componente.

  2. Perform a write transaction, and create a Task object with an _id value of 1234.

  3. Llame a Realm.create() dentro de la transacción de escritura para insertar un objeto Task especificando el mismo _id y un ``progressMinutes`` diferente y el modo de actualización establecido en "modificado".

  4. Render the task's name and progressMinutes in the UI, showing the modified progress.

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

To apply an update to a collection of objects, iterate through the collection (e.g. with for...of). In the loop, update each object individually.

In the following example of a TaskDashboard component, we:

  1. Obtenga acceso a la instancia del reino abierto llamando al gancho useRealm() dentro del componente.

  2. Recupera todas las tareas en la instancia Realm pasando Task al gancho useQuery().

  3. Creamos un método de componente resetProgressOnAllTasks() que realiza una transacción de escritura. Dentro de esa transacción, actualizamos masivamente todas las tareas recorriéndolas en bucle usando for...of y estableciendo su progressMinutes a 0.

  4. Map through the tasks to render a list of Text components displaying each task's name and 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'
/>
</>
);
};

Volver

Lea

En esta página