2018.03.30、Android-ObjectBox-查询

303 阅读4分钟

基本查询操作

一、基本查询操作

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

QueryBuilder:

你可以使用 QueryBuilder自定义查询实体,搭配自动生成的属性类一起使用。
下面是一个例子:实体类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();

相关 QureyBuilder 查询语句请参考:QureyBuilder

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 )方法:

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() 。