Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

CRUD - 読み取り - React Native SDK

項目一覧

  • プライマリキーによる特定のオブジェクトの検索
  • オブジェクト タイプのクエリと結果のフィルタリング
  • オブジェクト タイプのクエリと結果のソート

読み取り操作は、Realm に保存されているデータを検索するためのクエリです。 Realm のデータはライブです。つまり、オブジェクトは常に最新の保存状態を反映し、読み取り操作はブロックされません。 変更に応じてオブジェクトが自動的に更新されるため、新しいクエリを実行しなくてもアプリケーション内で最新のデータを確認できます。

Realm 内のデータを読み取るには、次の @realm/reactフックを使用します。

  • useObject(): プライマリキーで特定のオブジェクトを検索

  • useQuery(): オブジェクトタイプ別にオブジェクトのコレクションを取得します。

これらのフックはライブ オブジェクトを返します。ライブ オブジェクトは、Realm 内のデータが変更されると自動的に更新されます。 これらのフックによって返されるオブジェクトが更新されると、フックを呼び出すコンポーネントは再レンダリングされます。

このページの例では、次のスキーマを使用します。

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 内の特定の型のすべてのオブジェクトと一致しますが、 コレクションにフィルターを適用して特定のオブジェクトを検索することもできます。

フィルターは、1 つ以上のオブジェクト プロパティの値に基づいて結果のサブセットを選択します。 Realmを使用すると、Realm からオブジェクトを取得するときに検索を制限するための string ベースのクエリ言語であるRQLを使用してデータをフィルタリングできます。

クエリをフィルタリングするには、クエリ結果コレクションでfiltered()を呼び出します。 RQLクエリを引数として filtered() に渡します。

TaskListコンポーネントの次の例では、次のことが行われます。

  1. "Task" をuseQuery()フックに渡して、すべてのTaskオブジェクトを取得します。

  2. クエリをfiltered()に渡して、すべての高優先順位のタスクと進行状況の低いタスクを取得します。

  3. map 関数を使用して、優先順位の高いタスクと進行状況の低いタスクに関する情報を表示するテキスト コンポーネントのリストをレンダリングします。

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

Tip

関連プロパティと埋め込みオブジェクト プロパティでフィルタリング

埋め込みオブジェクトまたは関連オブジェクトのプロパティに基づいてクエリをフィルタリングするには、通常のネストされたオブジェクトと同様に ドット表記 を使用します。

Tip

以下も参照してください。

ソート操作を使用すると、Realm がクエリされたオブジェクトを返す順序を構成できます。 You can sort based on one or more properties of the objects in the results collection. Realm では、明示的にソートした場合にのみ、結果の一貫した順序が保証されます。

クエリをソートするには、クエリ結果コレクションでソートされた()メソッドを呼び出します。

TaskListコンポーネントの次の例では、 useQuery()フックを使用して Task オブジェクトのセットを最初に検索します。 次に、 sorted()メソッドを使用してデータをさまざまな方法で操作します。

  1. タスク名に基づいてオブジェクトをアルファベット順に並べ替えます。

  2. タスク名に基づいてオブジェクトをアルファベット順に降順でソートします。

  3. タスクの優先順位に基づいてオブジェクトを降順でソートし、タスク名を昇順でソートします。

  4. 割り当て先オブジェクトの名前に基づいて、オブジェクトをアルファベット順に並べ替えます。

最後に、各タスク リストをマッピングし、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>
))}
</>
);
};

Tip

関連性と埋め込みオブジェクトのプロパティでソート

埋め込みオブジェクトまたは関連オブジェクトのプロパティに基づいてクエリをソートするには、通常のネストされたオブジェクトと同様に ドット表記 を使用します。

戻る

作成