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_iddo componente.Crie um método de componente
incrementTaskProgress()que realize uma transação de gravação e incremente oprogressMinutesda tarefa.Renderize os
nameeprogressMinutesda tarefa na interface do usuário.Adicione um eventoonPress no botão "incremento" que
incrementTaskProgress()chama.
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 embarcado 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 de gravação 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
Taskcom um valor_idde1234.Ligue para
Realm.create()dentro da transação de gravação para upsert um objetoTaskespecificando o mesmo_ide um diferente ''progressMinutes'' e o modo de atualização definido como "modificado".Renderize o
namee oprogressMinutesda 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
Taskpara 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...ofe definindoprogressMinutescomo 0.Mapeie as tarefas para renderizar uma lista de componentes do
Textexibindo cada tarefa donameeprogressMinutes.
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' /> </> ); };