ObjectBox[二] 教程:如何开始使用ObjectBox
ObjectBox[六] 数据监听和RX(Data Observers and Reactive Extensions)
ObjectBox[七] 支持LiveData(Android体系结构组件)
ObjectBox[十二] Meta Model, IDs, and UIDs
ObjectBox 查询结果返回符合用户定义条件的持久化对象,您可以使用QueryBuilder类来指定条件并创建查询对象。Query类将实际运行查询并返回匹配的对象。
你可以使用 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是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。
查询对象允许您以有效的方式多次执行查询。为了使查询更加可重用,您以前在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来获取,频繁查询会提高性能。
有时您只需要查询结果一个子集,例如在您的用户界面中显示的前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 :返回此查询的数量。
为了避免立即加载查询结果,Query提供了 findLazy()
和 findLazyCached()
,它们返回 查询结果的LazyList
。
LazyList是一个线程安全的,不可修改的列表,只有在访问数据后才会懒惰地读取数据。根据调用的查找方法不同可以选择是否缓存。缓存的懒惰列表存储先前访问的对象,以避免多次加载实体。列表的某些功能仅限于缓存列表(例如需要整个列表的功能)。请参阅LazyList 文档以获取更多详细信息。
默认情况下,关系会被懒加载,当你第一次访问它时,它将执行一个数据库查找来获取数据(以后的访问将得到一个缓存值-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()
。