与GreenDao一样,建立与数据库中某表对应的实体类,代码如下:
@Entity
public class Person {
@Id
private long id;//必须有一个long类型的
private String name;
private String address;
//省略get/set方法--不可少
...
}
然后点击“Build”–“Make Project”。
如果出现报错,那就查看是不是以下的原因:
1. 属性定义为private而没有相应的get/set方法;
2. 属性变量的命名问题,例如上述的name改成mName,自动生成的get方法是getName(),在Make之后会报下面的错误:
可能有的小伙伴会奇怪为什么第一步不是直接进行ObjectBox的初始化,在官方的文档中有这么一句话:
Next go ahead and build the project, for example by using “Build > Make project” in Android Studio. This triggers ObjectBox to generate some classes, like MyObjectBox.java, and some other classes used by ObjectBox internally.
大概的意思就是说,ObjectBox中的有些类(例如MyObjectBox类)需要在Make的操作之后才会自动生成。
接下来就去BaseApplication类中进行初始化操作,同时暴露出获取BoxStore的接口(其实这一步操作类似于以前用DbHelper去打开数据库一样),代码如下:
public class BaseApplication extends Application {
private static BaseApplication sInstance;
private BoxStore mBoxStore;
public static BaseApplication getInstance() {
return SingletonHolder.INSTANCE;
}
@Override
public void onCreate() {
super.onCreate();
init();
}
private void init() {
sInstance = this;
mBoxStore = MyObjectBox.builder().androidContext(this).build();
}
public BoxStore getBoxStore() {
return mBoxStore;
}
private static class SingletonHolder {
private static final BaseApplication INSTANCE = sInstance;
}
}
别忘了去,同时记得去manifest文件中修改相关的代码:
要进行CRUD的操作,肯定得先确定去操作哪个表的数据。
例如我们要操作上面中的Person类的表–Box< Person>,可以用下面的代码获取到这个表的实例:
public class MainActivity extends AppCompatActivity {
private Box mPersonBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
initView();
initData();
}
private void initData() {
mPersonBox = BaseApplication.getInstance().getBoxStore().boxFor(Person.class);
//init ori data
...
}
...
}
如果你在Person类中生成了构造,那就按如下的方式进行C操作:
Person person = new Person(0L, "China", "HanMeiMei");
mPersonBox.put(person);
如果Person类仅有默认的无参构造,那么代码如下:
Person person=new Person();
person.setAddress("China");
person.setName("HanMeiMei");
mPersonBox.put(person);
对比下上述的2种方法,我们发现,在有构造的时候id我们始终填写的是0L;在无参的情况下,我们并没手动的去设置id的值。但是在我们查询所有数据的时候,我们会发现,每个Person的id都不一样,而且是自增长的。关于@Id这个注解会在后续与其他注解一并进行说明,此处知道有这个需要注意的地方就行。
ObjectBox的删除操作有好几个,下面是删除操作的重载方法:
removeAll() :删除所有
remove(Person object) :删除某一个Person
remove(Collection objects) :删除某个Person的集合
remove(long id) :删除某个Person
remove(long… ids) :删除多个Person
remove(Person…objects) :删除多个Person
removeByKeys(Collection ids) :根据ids删除对应的Person
代码仅做简单的展示(删除第一个):
mPersonBox.remove(1);
要修改,肯定要先获取待修改的Person对象,复杂的查询操作会在后续进行说明,这里并不做重点,仅以数据库的第一个Person展示修改操作的代码:
private void doU() {
Person person = mPersonBox.getAll().get(0);
person.setName("LiLei");//update the name
mPersonBox.put(person);
}
不论是GreenDao,Realm还是ObjectBox,查询操作在CRUD里面总是最复杂的。
而在ObjectBox里面,查询的方法有3大类:
get
find
query
通过下面的代码可以关闭当前表的操作:
mPersonBox.query().close();
本来打算把查询这一部分也在这个章节写完的,但由于这一部分内容较多,每个重载函数我都得去测试一遍,而且在find函数这一块遇到了点问题,所以暂时搁笔,后续会专门开一篇来介绍这三大类查询方法。