Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

CRUD - 업데이트 - React Native SDK

이 페이지의 내용

  • 객체 업데이트
  • 객체 업서트
  • 컬렉션 대량 업데이트

이 페이지의 예시에서는 다음 스키마를 사용합니다.

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

다른 JavaScript 객체를 업데이트하는 것과 같은 방식으로 Realm 객체의 속성을 추가, 수정, 삭제할 수 있습니다. 그러나 쓰기 트랜잭션(write transaction) 내에서 수행해야 합니다.

다음 TaskItem 구성 요소 예시에서 다음을 수행합니다.

  1. 구성 요소 내에서 useRealm() 훅을 호출하여 열린 영역 인스턴스에 대한 액세스 권한을 얻습니다.

  2. 'Task' 및 구성 요소의 _id 매개 변수를 사용하여 useObject()를 호출하여 작업을 조회합니다.

  3. 쓰기 트랜잭션(write transaction)을 수행하고 작업의 progressMinutes를 증가시키는 구성 요소 메서드 incrementTaskProgress()를 만듭니다.

  4. UI에서 작업의 nameprogressMinutes를 렌더링합니다.

  5. onPress 추가 을(를) 호출하는 "증가" 버튼의 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 <></>;
}
};

관련 객체 및 내장된 객체 업데이트

내장된 객체 또는 관련 객체 의 속성 을 업데이트 하려면 점 표기법 또는 대괄호 표기법을 사용 하여 속성 을 수정합니다. 일반 중첩 객체 에 있는 것처럼 보입니다.

쓰기 트랜잭션(write transaction) 내에서 객체를 업서트하려면 업데이트 모드를 modified 으로 설정하여 Realm.create() 를 호출합니다. 이 작업은 지정된 기본 키를 사용하여 새 객체를 삽입하거나 해당 기본 키가 이미 있는 기존 객체를 업데이트합니다.

참고

업서팅에는 Realm.create()가 필요합니다.

객체를 업서트하려면 쓰기 트랜잭션(write transaction) 내에서 Realm.create() 를 호출 해야 합니다. 이는 새 Realm 객체를 호출하여 새 Realm 객체 를 만드는 것과는 다릅니다. 연산자.

다음 예시에서는 CreateTaskItem 컴포넌트를 사용합니다.

  1. 구성 요소 내에서 useRealm() 훅을 호출하여 열린 영역 인스턴스에 대한 액세스 권한을 얻습니다.

  2. 쓰기 트랜잭션(write transaction)을 수행하고 _id 값이 1234Task 객체를 생성합니다.

  3. 쓰기 트랜잭션(write transaction) 내에서 Realm.create()를 호출해 동일한 _id 및 다른 ProgressMinets로 지정하고 업데이트 모드를 'Modified' 로 설정하여 Task 객체를 업서트합니다.

  4. UI에서 작업의 nameprogressMinutes을 렌더링하여 수정된 진행률을 표시합니다.

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

객체 collection에 업데이트를 적용하려면 collection을 반복합니다(예: for...of 사용). 루프에서 각 객체를 개별적으로 업데이트합니다.

다음 예시에서는 TaskDashboard 컴포넌트를 사용합니다.

  1. 구성 요소 내에서 useRealm() 훅을 호출하여 열린 영역 인스턴스에 대한 액세스 권한을 얻습니다.

  2. TaskuseQuery() 후크로 전달하여 영역 인스턴스에 있는 모든 작업을 검색하세요.

  3. 쓰기 트랜잭션(write transaction)을 수행하는 컴포넌트 메서드 resetProgressOnAllTasks()를 만듭니다. 해당 쓰기 트랜잭션(write transaction) 내에서 for...of를 사용해 모든 작업을 반복하고 progressMinutes를 0으로 설정하여 모든 작업을 일괄 업데이트합니다.

  4. 지도 작업을 Text 통해 각 작업의 name 및 을 표시하는 구성 요소 목록을 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'
/>
</>
);
};

돌아가기

읽기