Docs Menu
Docs Home
/ /
CRUD

CRUD - Actualización - SDK de React Native

Los ejemplos de esta página utilizan el siguiente esquema:

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

Puedes agregar, modificar o eliminar propiedades de un objeto Realm de la misma manera que actualizarías cualquier otro objeto JavaScript. Sin embargo, 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. Recupere una tarea llamando a useObject() con "Tarea" y el parámetro _id del componente.

  3. Crea un método de componente incrementTaskProgress() que realiza una transacción de escritura e incrementa el progressMinutes ​​de la tarea.

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

  5. Agregar 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

Para actualizar una propiedad de un objeto incrustado o un objeto relacionado, modifique la propiedad con notación de punto o de corchetes como si estuviera en un objeto anidado normal.

Para insertar un objeto en una transacción de escritura, llame a Realm.create() con el modo de actualización establecido modified en. La operación inserta un nuevo objeto con la clave principal dada o actualiza un objeto existente que ya la tiene.

Nota

La inserción requiere Realm.create()

Debes llamar a Realm.create() dentro de una transacción de escritura para insertar un objeto. Esto es diferente a crear un nuevo objeto de dominio llamando al operador "new".

En el siguiente ejemplo de un componente CreateTaskItem:

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

  2. Realice una transacción de escritura y cree un Task objeto con un _id valor 1234 de.

  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. Representa las tareas name y progressMinutes en la interfaz de usuario, mostrando el progreso modificado.

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

Para aplicar una actualización a una colección de objetos, itera sobre ella (por ejemplo, con for...of). En el bucle, actualiza cada objeto individualmente.

En el siguiente ejemplo de un componente TaskDashboard, hacemos lo siguiente:

  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. Crea un método de componente resetProgressOnAllTasks() que realiza una transacción de escritura. Dentro de esa transacción, actualizamos en bloque todas las tareas recorriéndolas con for...of y estableciendo su valor de progressMinutes en 0.

  4. Recorra las tareas para generar una lista de Text componentes que muestren los name y de cada progressMinutes tarea.

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