Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/ /

筛选数据 - C++ SDK

在此页面上

  • 关于本页中的示例
  • 过滤数据
  • 比较操作符。
  • 逻辑操作符
  • 字符串操作符

要筛选 Realm 中的数据,您可以利用 Realm 的查询引擎。 您还可以对筛选后的数据进行排序。 有关如何对查询结果进行排序的示例,请参阅排序列表和查询结果。

注意

C++ SDK 尚不支持其他 SDK 提供的全部查询表达式。

本页中的示例使用了一个待办事项列表应用的简单数据集。 两种 Realm 对象类型分别是 ProjectItemItem具有:

  • 名称

  • 已完成标志

  • 可选受让人名称

  • 代表优先级的数字,数字越大越重要

  • 处理该问题所花费的分钟数

Project具有名称以及与零个或多个Items的多对多关系。

ProjectItem的模式为:

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

后退

删除