ObjectBox入门(续)

查询

前面也提到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 >,而且从其第二个参数我们可以发现只有longString两种类型。也就说,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
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值