Android数据库ObjectBox使用笔记[二]:查询操作

ObjectBox[一]:入门
ObjectBox[二]:查询操作
ObjectBox[三]:关系
ObjectBox[四]:事务
ObjectBox[五]:Kotlin支持
ObjectBox[六]:数据监听和RX

一、条件查询

1、单条件查询

// 查询 firstName 叫做 “joe”的人 
List joes = userBox.query()
				.equal(User_.firstName, "Joe")
				.build()
				.find();

2、多条件查询

// 获得名“Joe”的用户,这些用户出生于1970年以后,姓以“O”开头。
QueryBuilder builder = userBox.query();

builder.equal(User_.firstName, "Joe")
        .greater(User_.yearOfBirth, 1970)
        .startsWith(User_.lastName, "O");
        
List 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 query = userBox.query().equal(User_.firstName, "").build();

具体实际查询:

// change firstName parameter to "Joe", get results
List joes = query.setParameter(User_.firstName, "Joe").find();
...
// change firstName parameter to "Jake", get results
List jakes = query.setParameter(User_.firstName, "Jake").find();

对firstName 属性设置多个查询条件时:

  • 为equal()查询参数分配别名“name”
Query query = userBox.query()
        .equal(User_.firstName, "").parameterAlias("name");
  • 然后,当设置一个新的参数值时,通过别名而不是属性:
List joes = query.setParameter("name", "Joe").find();

3、限制、分页、偏移查询

// 从 第5个开始(不含第五个),查询 之后的10个
List stuList = mStuBox.query().equal(Student_.name, "张三")
                .build()
                .find(5, 10);

4、懒加载查询结果

query提供findLazy()和findLazyCached(),它们返回查询结果的LazyList。

LazyList 是一个线程安全的、不可修改的列表,只有在实体被访问时才会懒洋洋地读取它们。根据所调用的find方法,延迟列表是否会被缓存。缓存的惰性列表存储以前访问过的对象,以避免多次加载实体。列表的一些特性仅限于缓存列表(例如,需要整个列表的特性)。

List stuList = mStuBox.query().equal(Student_.name, "小明")
                .build()
                .findLazy();

Android数据库ObjectBox使用笔记[二]:查询操作_第1张图片

三、属性查询

如果您只想返回某个属性的值,而不是完整对象的列表,那么可以使用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 stuBuilder = mStuBox.query()
				.equal(Student_.name, "小明0");
 List courses =stuBuilder
 				.link(Student_.courses)
 				.equal(Course_.courseName, "语文")
                		.build().find();

   // 获得 学习课程名称为 :语文 ,学生姓名为:小明0  所有学生
Box courseBox = ((App) getApplication()).getBoxStore()
				.boxFor(Course.class);

QueryBuilder couBuilder = courseBox.query()
				.equal(Course_.courseName, "语文");
List students = couBuilder.backlink(Student_.courses)
				.equal(Student_.name, "小明0")
				.build()
				.find();

五、过滤查询

你可能感兴趣的:(ObjectBox,笔记)