Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ /

CRUD - Atualização - React Native SDK

Nesta página

  • Atualizar um objeto
  • Upsert de Objeto
  • Atualizar em massa uma coleção

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

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:

  1. Conseguir acesso à instância do domínio aberta chamando o gancho useRealm() dentro do componente.

  2. Recupere uma tarefa chamando useObject() com "Tarefa" e o parâmetro _id do componente.

  3. Crie um método de componente incrementTaskProgress() que realize uma transação de gravação e incremente o progressMinutes da tarefa.

  4. Renderize os name e progressMinutes da tarefa na interface do usuário.

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

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:

  1. Conseguir acesso à instância do domínio aberta chamando o gancho useRealm() dentro do componente.

  2. Execute uma transação de gravação e crie um objeto Task com um valor _id de 1234.

  3. Ligue para Realm.create() dentro da transação de gravação para upsert um objeto Task especificando o mesmo _id e um diferente ''progressMinutes'' e o modo de atualização definido como "modificado".

  4. Renderize o name e o progressMinutes 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>
</>
);
};

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:

  1. Conseguir acesso à instância do domínio aberta chamando o gancho useRealm() dentro do componente.

  2. Recupere todas as tarefas na instância do domínio passando Task para o hook useQuery().

  3. 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 usando for...of e definindo progressMinutes como 0.

  4. Map através das tarefas para renderizar uma lista de Text componentes do exibindo cada tarefa name progressMinutesdo 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'
/>
</>
);
};

Voltar

Leia

Próximo

Excluir