ObjectBox[一]:入门
ObjectBox[二]:查询操作
ObjectBox[三]:关系
ObjectBox[四]:事务
ObjectBox[五]:Kotlin支持
ObjectBox[六]:数据监听和RX
一、条件查询
1、单条件查询
// 查询 firstName 叫做 “joe”的人
List<User> joes = userBox.query()
.equal(User_.firstName, "Joe")
.build()
.find();
2、多条件查询
// 获得名“Joe”的用户,这些用户出生于1970年以后,姓以“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();
3、其他条件
-
equal()、notEqual()、 greater() 、less()
-
isNull() and notNull(),
-
between():过滤给定两个值之间的值
mStuBox.query().between(Student_.age,18,20)
- in() and notIn():
String[] names =new String[]{"小明","小米"};
mStuBox.query().in(Student_.name, names,QueryBuilder.StringOrder.CASE_SENSITIVE);
- startsWith(), endsWith() and contains()
排序结果
按升序排列,忽略大小写
userBox.query().equal(User_.firstName, "Joe")
.order(User_.lastName) // 按升序排列,忽略大小写
.find();
以降序和区分大小写的方式
// QueryBuilder.DESCENDING :降序
// QueryBuilder.CASE_SENSITIVE :区分大小写
userBox.query().equal(User_.firstName, "Joe")
.order(User_.lastName, QueryBuilder.DESCENDING | QueryBuilder.CASE_SENSITIVE)
.find();
二、单表查询
1、find
返回与查询匹配的所有实体
List joes = query.find();
只返回第一个结果
User joe = query.findFirst();
如果您想要一个唯一的结果调用findUnique()。如果没有找到匹配的实体,它将给您一个结果或null,如果有多个结果,则抛出异常。
User joe = query.findUnique();
2、复用query 和参数
初始化 query ,查询条件 暂无:备用 query
// build query
Query<User> query = userBox.query().equal(User_.firstName, "").build();
具体实际查询:
// change firstName parameter to "Joe", get results
List<User> joes = query.setParameter(User_.firstName, "Joe").find();
...
// change firstName parameter to "Jake", get results
List<User> jakes = query.setParameter(User_.firstName, "Jake").find();
对firstName 属性设置多个查询条件时:
- 为equal()查询参数分配别名“name”
Query<User> query = userBox.query()
.equal(User_.firstName, "").parameterAlias("name");
- 然后,当设置一个新的参数值时,通过别名而不是属性:
List<User> joes = query.setParameter("name", "Joe").find();
3、限制、分页、偏移查询
// 从 第5个开始(不含第五个),查询 之后的10个
List<Student> stuList = mStuBox.query().equal(Student_.name, "张三")
.build()
.find(5, 10);
4、懒加载查询结果
query提供findLazy()和findLazyCached(),它们返回查询结果的LazyList。
LazyList 是一个线程安全的、不可修改的列表,只有在实体被访问时才会懒洋洋地读取它们。根据所调用的find方法,延迟列表是否会被缓存。缓存的惰性列表存储以前访问过的对象,以避免多次加载实体。列表的一些特性仅限于缓存列表(例如,需要整个列表的特性)。
List<Student> stuList = mStuBox.query().equal(Student_.name, "小明")
.build()
.findLazy();
三、属性查询
如果您只想返回某个属性的值,而不是完整对象的列表,那么可以使用PropertyQuery。
// 返回第一个值
int age = mStuBox.query()
.build()
.property(Student_.age)
.findInt();
// 返回所有值
int[] ages = mStuBox.query()
.build()
.property(Student_.age)
.findInts();
注意:返回的属性值数组没有任何特定的顺序,即使您在构建查询时指定了顺序。
1、处理属性为 null 值
默认情况下,不返回空值。但是,如果属性为空,您可以指定要返回的替换值:
// returns 'unknown' if email is null
String[] emails = userBox.query().build()
.property(User_.email)
.nullValue("unknown")
.findStrings();
2、查询唯一结果
// returns 'joe'
String[] names = userBox.query().build()
.property(User_.firstName)
.distinct()
.findStrings();
// returns 'Joe', 'joe', 'JOE'
String[] names = userBox.query().build()
.property(User_.firstName)
.distinct(StringOrder.CASE_SENSITIVE)
.findStrings();
3、聚合数据
Property queries(JavaDoc)还提供聚合函数,直接计算所有找到的值的最小值、最大值、平均值、和和计数:
- min() / minDouble() : 获得最小值
- max() / maxDouble() : 获得最大值
- sum() / sumDouble() : 求和
- avg() :平均数
- count() :总数
年龄求和
long allAges = mStuBox.query()
.build()
.property(Student_.age)
.sum();
四、多表查询
由于ObjectBox不是SQL数据库, 使用 link 能使不同表数据实体进行关联查询。
// 获得 学生姓名为:小明 ,课程名称为:语文的 所有课程
QueryBuilder<Student> stuBuilder = mStuBox.query()
.equal(Student_.name, "小明0");
List<Course> courses =stuBuilder
.link(Student_.courses)
.equal(Course_.courseName, "语文")
.build().find();
// 获得 学习课程名称为 :语文 ,学生姓名为:小明0 所有学生
Box<Course> courseBox = ((App) getApplication()).getBoxStore()
.boxFor(Course.class);
QueryBuilder<Course> couBuilder = courseBox.query()
.equal(Course_.courseName, "语文");
List<Student> students = couBuilder.backlink(Student_.courses)
.equal(Student_.name, "小明0")
.build()
.find();