CRUD - Atualização - React Native SDK
Os exemplos nesta página usam o seguinte 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', }; }
Atualizar um objeto
Você pode adicionar, modificar ou excluir propriedades de um objeto do Realm da mesma maneira que atualizaria qualquer outro objeto JavaScript. Mas você deve fazer isso dentro de uma transação por gravação.
No seguinte exemplo de um componente TaskItem
, nós:
Conseguir acesso à instância do domínio aberta chamando o gancho
useRealm()
dentro do componente.Recupere uma tarefa chamando
useObject()
com "Tarefa" e o parâmetro_id
do componente.Crie um método de componente
incrementTaskProgress()
que realize uma transação de gravação e incremente oprogressMinutes
da tarefa.Renderize os
name
eprogressMinutes
da tarefa na interface do usuário.Adicione um onPress evento no botão "incremento" que chama
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 <></>; } };
Dica
Atualizar Objetos Relacionados e Integrados
Para atualizar uma propriedade de um objeto incorporado ou de um objeto relacionado, modifique a propriedade com notação de ponto ou notação em colchetes como se estivesse em um objeto aninhado regular.
Upsert de Objeto
Para fazer o upsert de um objeto em uma transação de escrita, chame Realm.create() com o modo de atualização definido como modified
. A operação insere um novo objeto com a chave primária fornecida ou atualiza um objeto existente que já tem essa chave primária.
Observação
Fazer upsert requer Realm.create()
Você deve chamar Realm.create()
dentro de uma transação escrita para upsert um objeto. Isso é diferente de criar um novo Realm Objects chamando o novo operador.
No exemplo a seguir de um componente CreateTaskItem
, nós:
Conseguir acesso à instância do domínio aberta chamando o gancho
useRealm()
dentro do componente.Execute uma transação de gravação e crie um objeto
Task
com um valor_id
de1234
.Ligue para
Realm.create()
dentro da transação de gravação para upsert um objetoTask
especificando o mesmo_id
e um diferente ''progressMinutes'' e o modo de atualização definido como "modificado".Renderize o
name
e oprogressMinutes
da tarefa na interface do usuário, mostrando o progresso 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> </> ); };
Atualizar em massa uma coleção
Para aplicar uma atualização a uma coleção de objetos, itere pela coleção (por exemplo, com para... de). No loop, atualize cada objeto individualmente.
No exemplo a seguir de um componente TaskDashboard
, nós:
Conseguir acesso à instância do domínio aberta chamando o gancho
useRealm()
dentro do componente.Recupere todas as tarefas na instância do domínio passando
Task
para o hookuseQuery()
.Crie um método de componente
resetProgressOnAllTasks()
que execute uma transação de escrita. Nessa transação de escrita, atualizamos em massa todas as tarefas percorrendo-as usandofor...of
e definindoprogressMinutes
como 0.Map através das tarefas para renderizar uma lista de
Text
componentes do exibindo cada tarefaname
progressMinutes
do e .
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' /> </> ); };