CRUD - 읽기 - React Native SDK
읽기 작업은 Realm에 저장된 데이터를 찾기 위한 쿼리입니다. Realm의 데이터는 라이브 상태이므로 객체는 항상 가장 최근에 저장된 상태를 반영하며 읽기 작업이 차단되지 않습니다. 변경 사항에 따라 객체가 자동으로 업데이트되므로 새 쿼리를 실행하지 않고도 애플리케이션에서 최신 데이터를 볼 수 있습니다.
다음 @realm/react
훅을 사용하여 영역의 데이터를 읽습니다:
useObject()
: 프라이머리 키로 특정 객체를 찾습니다.useQuery()
: 객체 유형별로 객체 컬렉션을 가져옵니다.
이러한 후크는 영역의 데이터가 변경될 때 자동으로 업데이트되는 라이브 객체를 반환합니다. 이러한 후크에서 반환된 객체가 업데이트되면 후크를 호출하는 구성 요소가 다시 렌더링됩니다.
이 페이지의 예시에서는 다음 스키마를 사용합니다.
class Person extends Realm.Object { static schema = { name: 'Person', properties: { name: 'string', age: 'int?', }, }; }
class Task extends Realm.Object { static schema = { name: 'Task', properties: { _id: 'int', name: 'string', priority: 'int?', progressMinutes: 'int?', assignee: 'Person?', }, primaryKey: '_id', }; }
class Person extends Realm.Object<Person> { name!: string; age?: number; static schema: ObjectSchema = { name: 'Person', properties: { name: 'string', age: 'int?', }, }; }
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', }; }
기본 키로 특정 객체 찾기
특정 객체의 프라이머리 키를 알고 있는 경우 클래스 유형과 프라이머리 키를 useObject()
훅에 전달하여 직접 조회할 수 있습니다.
TaskItem
컴포넌트의 다음 예시에서, useObject()
훅을 사용하여 프라이머리 키인 _id
기반으로 작업을 찾습니다. 그런 다음 UI에 작업의 이름과 우선순위를 렌더링합니다.
const TaskItem = ({_id}) => { const myTask = useObject(Task, _id); return ( <View> {myTask ? ( <Text> {myTask.name} is a task with the priority of: {myTask.priority} </Text> ) : null} </View> ); };
const TaskItem = ({_id}: {_id: number}) => { const myTask = useObject(Task, _id); return ( <View> {myTask ? ( <Text> {myTask.name} is a task with the priority of: {myTask.priority} </Text> ) : null} </View> ); };
객체 유형 쿼리 및 결과 필터링
useQuery()
후크는 쿼리 와 일치하는 Realm 객체 컬렉션 을 Realm.Results 객체 로 반환합니다. 기본 쿼리 는 영역 에서 지정된 유형의 모든 객체와 일치하지만 컬렉션 에 필터하다 를 적용 하여 특정 객체를 찾을 수도 있습니다.
필터는 하나 이상의 객체 속성 값을 기반으로 결과의 하위 집합을 선택합니다. Realm을 사용하면 문자열 기반 쿼리 언어인 Realm Query Language 영역에서 객체를 검색할 때 검색을 제한하는 데이터 필터링이 가능합니다.
쿼리 결과 컬렉션에서 wired() 를 호출하여 쿼리를 필터링합니다. RQL 쿼리를 인수로 filtered()
에 전달합니다.
다음 예시에서는 TaskList
컴포넌트를 사용합니다.
'작업'을
useQuery()
후크에 전달하여 모든Task
객체를 가져옵니다.쿼리를
filtered()
에 전달하여 우선 순위가 높은 작업과 진행 상태가 낮은 작업을 모두 가져옵니다.맵 함수를 사용하여 우선 순위가 높은 작업과 진행 상태가 낮은 작업에 대한 정보를 표시하는 Text 구성 요소 목록을 렌더링할 수 있습니다.
const TaskList = () => { const [priority, setPriority] = useState(4); // filter for tasks with a high priority const highPriorityTasks = useQuery( Task, (tasks) => { return tasks.filtered("priority >= $0", priority); }, [priority] ); // filter for tasks that have just-started or short-running progress const lowProgressTasks = useQuery(Task, tasks => { return tasks.filtered( '$0 <= progressMinutes && progressMinutes < $1', 1, 10, ); }); return ( <> <Text>Your high priority tasks:</Text> {highPriorityTasks.map(taskItem => { return <Text>{taskItem.name}</Text>; })} <Text>Your tasks without much progress:</Text> {lowProgressTasks.map(taskItem => { return <Text>{taskItem.name}</Text>; })} </> ); };
const TaskList = () => { const [priority, setPriority] = useState(4); // filter for tasks with a high priority const highPriorityTasks = useQuery( Task, tasks => { return tasks.filtered('priority >= $0', priority); }, [priority], ); // filter for tasks that have just-started or short-running progress const lowProgressTasks = useQuery(Task, tasks => { return tasks.filtered( '$0 <= progressMinutes && progressMinutes < $1', 1, 10, ); }); return ( <> <Text>Your high priority tasks:</Text> {highPriorityTasks.map(taskItem => { return <Text>{taskItem.name}</Text>; })} <Text>Your tasks without much progress:</Text> {lowProgressTasks.map(taskItem => { return <Text>{taskItem.name}</Text>; })} </> ); };
객체 유형 쿼리 및 결과 정렬
정렬 연산을 통해 Realm이 쿼리된 객체를 반환하는 순서를 설정할 수 있습니다. 결과 컬렉션에 있는 객체의 속성을 하나 이상의 기준으로 정렬할 수 있습니다. Realm은 명시적으로 정렬하는 경우에만 결과의 일관된 순서를 보장합니다.
쿼리를 정렬하려면 쿼리 결과 collection에서 sorted( ) 메서드를 호출합니다.
다음 TaskList
구성 요소 예시에서는 useQuery()
훅을 사용하여 처음에 작업 객체 세트를 조회합니다. 그런 다음 sorted()
메서드를 사용하여 다양한 방식으로 데이터로 작업합니다:
작업 이름을 기준으로 객체를 알파벳순으로 정렬합니다.
작업 이름을 기준으로 객체를 알파벳 내림차순으로 정렬합니다.
작업 우선순위를 기준으로는 내림차순, 작업 이름을 기준으로는 오름차순으로 객체를 정렬합니다.
담당자 객체 이름을 기준으로 객체를 알파벳순으로 정렬합니다.
마지막으로 각 작업 목록을 매핑하고 이를 UI에 렌더링합니다.
const TaskList = () => { // retrieve the set of Task objects const tasks = useQuery(Task); // Sort tasks by name in ascending order const tasksByName = useQuery(Task, tasks => { return tasks.sorted('name'); }); // Sort tasks by name in descending order const tasksByNameDescending = useQuery(Task, tasks => { return tasks.sorted('name', true); }); // Sort tasks by priority in descending order and then by name alphabetically const tasksByPriorityDescendingAndName = useQuery(Task, tasks => { return tasks.sorted([ ['priority', true], ['name', false], ]); }); // Sort Tasks by Assignee's name. const tasksByAssigneeName = useQuery(Task, tasks => { return tasks.sorted('assignee.name'); }); return ( <> <Text>All tasks:</Text> {tasks.map(task => ( <Text>{task.name}</Text> ))} <Text>Tasks sorted by name:</Text> {tasksByName.map(task => ( <Text>{task.name}</Text> ))} <Text>Tasks sorted by name descending:</Text> {tasksByNameDescending.map(task => ( <Text>{task.name}</Text> ))} <Text> Tasks sorted by priority descending, and name alphabetically: </Text> {tasksByPriorityDescendingAndName.map(task => ( <Text> {task.name} </Text> ))} <Text>Tasks sorted by assignee name:</Text> {tasksByAssigneeName.map(task => ( <Text>{task.name}</Text> ))} </> ); };
const TaskList = () => { // retrieve the set of Task objects const tasks = useQuery(Task); // Sort tasks by name in ascending order const tasksByName = useQuery(Task, tasks => { return tasks.sorted('name'); }); // Sort tasks by name in descending order const tasksByNameDescending = useQuery(Task, tasks => { return tasks.sorted('name', true); }); // Sort tasks by priority in descending order and then by name alphabetically const tasksByPriorityDescendingAndName = useQuery(Task, tasks => { return tasks.sorted([ ['priority', true], ['name', false], ]); }); // Sort Tasks by Assignee's name. const tasksByAssigneeName = useQuery(Task, tasks => { return tasks.sorted('assignee.name'); }); return ( <> <Text>All tasks:</Text> {tasks.map(task => ( <Text>{task.name}</Text> ))} <Text>Tasks sorted by name:</Text> {tasksByName.map(task => ( <Text>{task.name}</Text> ))} <Text>Tasks sorted by name descending:</Text> {tasksByNameDescending.map(task => ( <Text>{task.name}</Text> ))} <Text> Tasks sorted by priority descending, and name alphabetically: </Text> {tasksByPriorityDescendingAndName.map(task => ( <Text> {task.name} </Text> ))} <Text>Tasks sorted by assignee name:</Text> {tasksByAssigneeName.map(task => ( <Text>{task.name}</Text> ))} </> ); };