읽기 작업은 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> ))} </> ); };