이 페이지의 예시에서는 다음 스키마를 사용합니다.
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으로 설정하여 모든 작업을 일괄 업데이트합니다.작업을 매핑 하여 각 작업의
name및progressMinutes을 표시하는Text구성 요소 목록을 렌더링합니다.
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' /> </> ); };