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
구성 요소 예시에서 다음을 수행합니다.
구성 요소 내에서
useRealm()
훅을 호출하여 열린 영역 인스턴스에 대한 액세스 권한을 얻습니다.'Task' 및 구성 요소의
_id
매개 변수를 사용하여useObject()
를 호출하여 작업을 조회합니다.쓰기 트랜잭션(write transaction)을 수행하고 작업의
progressMinutes
를 증가시키는 구성 요소 메서드incrementTaskProgress()
를 만듭니다.UI에서 작업의
name
및progressMinutes
를 렌더링합니다.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()가 필요합니다.
다음 예시에서는 CreateTaskItem
컴포넌트를 사용합니다.
구성 요소 내에서
useRealm()
훅을 호출하여 열린 영역 인스턴스에 대한 액세스 권한을 얻습니다.쓰기 트랜잭션(write transaction)을 수행하고
_id
값이1234
인Task
객체를 생성합니다.쓰기 트랜잭션(write transaction) 내에서
Realm.create()
를 호출해 동일한_id
및 다른 ProgressMinets로 지정하고 업데이트 모드를 'Modified' 로 설정하여Task
객체를 업서트합니다.UI에서 작업의
name
및progressMinutes
을 렌더링하여 수정된 진행률을 표시합니다.
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
컴포넌트를 사용합니다.
구성 요소 내에서
useRealm()
훅을 호출하여 열린 영역 인스턴스에 대한 액세스 권한을 얻습니다.Task
을useQuery()
후크로 전달하여 영역 인스턴스에 있는 모든 작업을 검색하세요.쓰기 트랜잭션(write transaction)을 수행하는 컴포넌트 메서드
resetProgressOnAllTasks()
를 만듭니다. 해당 쓰기 트랜잭션(write transaction) 내에서for...of
를 사용해 모든 작업을 반복하고progressMinutes
를 0으로 설정하여 모든 작업을 일괄 업데이트합니다.지도 작업을
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' /> </> ); };