ObjectBox[五]基本操作:查询

洪祺
2023-12-01

ObjectBox[一] 特性

ObjectBox[二] 教程:如何开始使用ObjectBox

ObjectBox[三] 教程:安装和基础

ObjectBox[四] 数据库持久化之实体注解

ObjectBox[五] 基本操作:查询

ObjectBox[六] 数据监听和RX(Data Observers and Reactive Extensions)

ObjectBox[七] 支持LiveData(Android体系结构组件)

ObjectBox[八] 关系

ObjectBox[九] 数据模型变更

ObjectBox[十] 自定义类型

ObjectBox[十一] 事务

ObjectBox[十二] Meta Model, IDs, and UIDs

ObjectBox[十三] 数据调试


ObjectBox 查询结果返回符合用户定义条件的持久化对象,您可以使用QueryBuilder类来指定条件并创建查询对象。Query类将实际运行查询并返回匹配的对象。

QueryBuilder

你可以使用 QueryBuilder<T>自定义查询实体,搭配自动生成的属性类一起使用。
下面是一个例子:实体类User和自动生成的属性类User_

单条件查询: 从所有用户中查找First name 是Joe的数据:

List<User> joes = userBox.query().equal(User_.firstName, "Joe").build().find();

多条件查询:从所有用户中查询First name 是Joe、1970年以后出生、并且LastName 是O开头的数据:

QueryBuilder<User> builder = userBox.query();
builder.equal(User_.firstName, "Joe")
        .greater(User_.yearOfBirth, 1970)
        .startsWith(User_.lastName, "O");
List<User> youngJoes = builder.build().find();

更多的查询语句,请参阅QueryBuilder类。

Query

Query是QueryBuilder.build()得到

Query<User> query = builder.build();

查找对象

这里有几个查找方法来检索匹配查询的对象:

// return all entities matching the query
List<User> joes = query.find();

// return only the first result or null if none
User joe = query.findFirst();

// return the only result or null if none, throw if more than one result
User joe = query.findUnique();

要返回匹配查询的所有实体,只需调用 find()。

要仅返回第一个结果,请使用 findFirst()。

如果你希望得到一个唯一的结果调用 findUnique()来代替。如果查询结果唯一,则返回该对象,如果查询结果不唯一,会抛出异常,如果没有查询结果则返回null。

重用query 和参数

查询对象允许您以有效的方式多次执行查询。为了使查询更加可重用,您以前在QueryBuilder中设置的所有条件值都可以更改。这就是我们称之为查询参数的原因。
我们来看一个例子:

Query<User> query = userBox.query().equal(User_.firstName, "").build();
List<User> joes = query.setParameter(User_.firstName, "Joe").find();
List<User> jakes = query.setParameter(User_.firstName, "Jake").find();

这里我们使用了同一个查询对象来查找两组用户,每个用户的名字都不同。请注意, 构建查询时,我们仍然需要初始化firstName属性的值 。因为我们使用setParameter ()覆盖值。我们可以在初始构建查询时传递一个空字符串。

重用query的好处是不用每次通过build来获取,频繁查询会提高性能。

限制、偏移和分页(Limit, Offset, and Pagination)

有时您只需要查询结果一个子集,例如在您的用户界面中显示的前10个元素。
当数据库中有大量数据时,这是非常有用的。你不能仅仅使用查询条件来限制结果,还可以使用Limit,
用offset和limit参数查找(long offset ,long limit )方法:

(跳过第10条,从第11条开始,查询总数为5的结果:)

Query<User> query = userBox.query().equal(UserProperties.FirstName, "Joe").build();
List<User> joes = query.find(/* offset by */ 10, /* limit to */ 5 /* results */);

offset :第一个 偏移量结果被跳过。
limit :返回此查询的数量。

懒加载结果(Lazy loading results)

为了避免立即加载查询结果,Query提供了 findLazy()findLazyCached() ,它们返回 查询结果的LazyList

LazyList是一个线程安全的,不可修改的列表,只有在访问数据后才会懒惰地读取数据。根据调用的查找方法不同可以选择是否缓存。缓存的懒惰列表存储先前访问的对象,以避免多次加载实体。列表的某些功能仅限于缓存列表(例如需要整个列表的功能)。请参阅LazyList 文档以获取更多详细信息。

关系(Relations)直接加载

默认情况下,关系会被懒加载,当你第一次访问它时,它将执行一个数据库查找来获取数据(以后的访问将得到一个缓存值-subsequent accesses will get a cached values without-)虽然这种查找是ObjectBox的快速操作,但有些情况下我们不希望对象关系懒加载。
所以ObjectBox还允许您直接加载关系,以避免出现一些问题。你可以使用QueryBuilder.eager()方法来直接加载。

最后

有时你不想从查询中返回对象,而是得到一个属性的聚合值。ObjectBox支持以下方法(每个都以属性作为参数):
min / minDouble:查找最小值。
max / maxDouble:查找最大值。
sum / sumDouble:计算所有值的总和。( ? Note: the non-double version detects overflows and throws an exception in that case.)
avg : 计算所有值的平均值(double类型)。

另外,可以直接通过调用count()来获得结果的数量。

删除对象

要删除所有匹配查询的对象,请调用 query.remove()


原文:http://objectbox.io/documentation/queries/

 类似资料: