查询
前面也提到ObjectBox的查询方法有一下3大类:
get
find
query
get方法
先来看下get方法的重载:
getAll()
getAll2()
get(long id)
get(long[] ids)
get(Iterable ids)
getAll()
该方法在源码中的注释是:
/* Returns all stored Objects in this Box. /
用于获取Box中,即表中所有的数据。
代码如下:
List<Person> persons = mPersonBox.getAll();
getAll2()
看到这个方法名是不是有点想打人的冲动?别着急,先来看下这个方法在源码:
/** Does not work yet, also probably won't be faster than {@link Box#getAll()}. */
@Temporary
public List<T> getAll2() {
Cursor<T> reader = getReader();
try {
return reader.getAll();
} finally {
releaseReader(reader);
}
}
惊不惊喜?!意不意外?!而且,重要的是,用这个方法去查询还查不到数据!还真的是 Does not work yet!
get(long id)
这个方法比较简单,从形参就可以看出来是用来查某个id的:
Person person = mPersonBox.get(1);
get(long[] ids)
这个方法也不难,用于获取指定几个id的数据:
long[] ids = {1, 2};
List<Person> persons = mPersonBox.get(ids);
get(Iterable ids)
这个方法是这个5个里面相对比较晦涩的。先看下源码:
/**
* Get the stored objects for the given IDs.
*
* @return null if not found
*/
public List<T> get(Iterable<Long> ids) {
ArrayList<T> list = new ArrayList<>();
Cursor<T> reader = getReader();
try {
for (Long id : ids) {
T entity = reader.get(id);
if (entity != null) {
list.add(entity);
}
}
} finally {
releaseReader(reader);
}
return list;
}
方法说明很简单:获取给定ids的存储的数据。
可是要怎么使用呢?
别急,先来看下Iterable这个接口。
可以看出我们常用的Collection、List、Set都是Iterable的实现类,也就是说,其实这个方法适用于查询一个有 id组成的集合所对应数据库中的数据的。
那么下面就是简单的代码演示:
List<Long>idList=new ArrayList<>();
idList.add(1L);
idList.add(2L);
idList.add(3L);
List<Person> persons = mPersonBox.get(idList);
到此,get方法结束。
find方法
先看重载函数:
find(int propertyId, long value)
find(int propertyId, String value)
find(Property property, long value)
find(Property property, String value)
find(String propertyName, long value)
find(String propertyName, String value)
总共有三组方法,返回值都是List< Person >,而且从其第二个参数我们可以发现只有long和String两种类型。也就说,find方法用于查询的话会有value值类型的限制,如果value是double,那么find方法将无法使用,只能依靠后面的query方法去进行查询。
关于存储数据类型的问题在ObjectBox的issues中也提到了https://github.com/objectbox/objectbox-java/issues/185。
回过头来,让我们来测试下上面的3组重载函数怎么使用。
第一组:
find(Property property, long value)
find(Property property, String value)
从其参数可以看出,是通过传Property作为Key来查询的。
那么这个Property怎么获取呢?请看代码:
//根据name查询
List<Person> persons = mPersonBox.find(Person_.name, "HanMeiMei");
//根据age查询
List<Person> persons = mPersonBox.find(Person_.age, 2);
这里需要注意的是Person_.name中的下划线,这个Person_是ObjectBox内部生成的properties class,即属性类,通过它可以直接获取Person类的各个属性。
第二组:
find(String propertyName, long value)
find(String propertyName, String value)
这个也比较好理解,直接看代码:
//根据name查询
List<Person> persons = mPersonBox.find("name", "HanMeiMei");
//根据age查询
List<Person> persons = mPersonBox.find("age", 2);
第三组:
find(int propertyId, long value)
find(int propertyId, String value)
在使用之前先来看下ObjectBox生成的model文件下下实体类的json文件:
再看看我们之前的Person类:
@Entity
public class Person {
@Id
private long id;
@NameInDb("personName")
private String name;
private String address