筛选数据 - C++ SDK
Atlas Device SDK 已弃用。 有关详细信息,请参阅弃用页面。
要筛选 Realm 中的数据,您可以利用 Realm 的查询引擎。 您还可以对筛选后的数据进行排序。 有关如何对查询结果进行排序的示例,请参阅排序列表和查询结果。
注意
C++ SDK 尚不支持其他 SDK 提供的全部查询表达式。
关于本页中的示例
本页中的示例使用了一个待办事项列表应用的简单数据集。 两种 Realm 对象类型分别是 Project
和Item
。 Item
具有:
名称
已完成标志
可选受让人名称
代表优先级的数字,数字越大越重要
处理该问题所花费的分钟数
Project
具有名称以及与零个或多个Items
的多对多关系。
Project
和Item
的模式为:
struct Item { std::string name; bool isComplete; std::optional<std::string> assignee; int64_t priority; int64_t progressMinutes; }; REALM_SCHEMA(Item, name, isComplete, assignee, priority, progressMinutes) struct Project { std::string name; std::vector<Item*> items; }; REALM_SCHEMA(Project, name, items)
您可以使用以下代码为这些示例设置 Realm:
auto config = realm::db_config(); auto realm = realm::db(std::move(config)); auto item1 = realm::Item{.name = "Save the cheerleader", .assignee = std::string("Peter"), .isComplete = false, .priority = 6, .progressMinutes = 30}; auto project = realm::Project{.name = "New project"}; project.items.push_back(&item1); realm.write([&] { realm.add(std::move(project)); }); auto items = realm.objects<realm::Item>(); auto projects = realm.objects<realm::Project>();
过滤数据
比较操作符。
价值比较
Operator | 说明 |
---|---|
== | 如果左侧表达式等于右侧表达式,则计算结果为 true 。 |
> | 如果左侧的数值或日期表达式大于右侧的数值或日期表达式,则计算结果为 true 。对于日期,如果左侧日期晚于右侧日期,则计算结果为 true 。 |
>= | 如果左侧数值或日期表达式大于或等于右侧数值或日期表达式,则计算结果为 true 。对于日期,如果左侧日期晚于或等于右侧日期,则计算结果为 true 。 |
< | 如果左侧数值或日期表达式小于右侧数值或日期表达式,则计算结果为 true 。对于日期,如果左侧日期早于右侧日期,则计算结果为 true 。 |
<= | 如果左侧数值表达式小于或等于右侧数值表达式,则计算结果为 true 。对于日期,如果左侧日期早于或等于右侧日期,则计算结果为 true 。 |
!= | 如果左侧表达式不等于右侧表达式,则计算结果为 true 。 |
例子
以下示例使用查询引擎的比较运算符执行以下操作:
通过将
priority
属性值与阈值数字进行比较来查找高优先级任务,而高于该阈值的优先级可视为高优先级。通过查看
progressMinutes
属性是否在特定范围内来查找刚刚启动或短时间运行的任务。通过查找
assignee
属性等于std::nullopt
的任务来查找未分配的任务。通过查看
assignee
属性是否在名称列表中来查找分配给团队成员 Ali 或 Jamie 的任务。
auto highPriorityItems = items.where([](auto const& item) { return item.priority > 5; }); auto quickItems = items.where([](auto const& item) { return item.progressMinutes > 1 && item.progressMinutes < 30; }); auto unassignedItems = items.where( [](auto const& item) { return item.assignee == std::nullopt; }); auto aliOrJamieItems = items.where([](auto const& item) { return item.assignee == std::string("Ali") || item.assignee == std::string("Jamie"); });
逻辑操作符
您可以使用下表列出的逻辑操作符制作复合谓词:
Operator | 说明 |
---|---|
&& | 如果左侧和右侧表达式的值均为 true ,则计算结果为 true : |
! | 对给定表达式的结果予以否定。 |
|| | 如果任一表达式返回 true ,则计算结果为 true 。 |
例子
我们可以使用查询语言的逻辑运算符来查找 Ali 已完成的所有任务。也就是说,我们会查找 assignee
属性值等于“Ali”且 isComplete
属性值为 true
的所有任务:
auto completedItemsForAli = items.where([](auto const& item) { return item.assignee == std::string("Ali") && item.isComplete == true; });
字符串操作符
您可以使用这些字符串运算符来比较字符串值。
Operator | 说明 |
---|---|
.contains(_ value: String) | 如果在左侧字符串表达式中的任意位置找到右侧字符串表达式,则计算结果为 true 。 |
== | 如果左侧字符串在字典顺序上等于右侧字符串,则计算结果为 true 。 |
!= | 如果左侧字符串在字典顺序上不等于右侧字符串,则计算结果为 true 。 |
例子
以下示例使用查询引擎的字符串操作符来查找:
名称中包含“ie”的项目
auto containIe = items.where([](auto const& item) { return item.name.contains("ie"); });