一、关于Realm的理解
之前对于数据库的使用方面,只了解过sqlite,之前自己简单的写了个短信拦截的小app,存储本地短信数据使用SqliteOpenHelper,然后编写各种增删改查的语句,还好当时只有几张表,没有写太多的数据库语句,近期现在做开发,几乎都是基于无线网或者流量来访问服务器的数据的,但是不乏还是有些项目需求,比如近期我遇到的项目便是基于数据库的;Realm是基于sqlite封装的一套数据库框架,但是是基于对象来实现的,它省去了我们自己去编写查询数据库并操作的过程,我们可以直接调用它提供的方法
二、关于Realm的使用
首先我们需要配置应用的build.gradle里面的配置,如下:
然后配置app的build.gradle里面的配置项:
我们需要在application中初始化Realm,代码如下:
Realm.init(this);
RealmConfiguration realmConfiguration = new RealmConfiguration
.Builder()
.name("myRealm.realm")
.deleteRealmIfMigrationNeeded()
.build();
Realm.setDefaultConfiguration(realmConfiguration);
然后在xml中配置application相关信息:
<application
android:name=".application.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
当我们需要使用realm对象的时候,需要当前的class中需要初始化的realm对象,具体代码如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wireless_remote);
//获取数据库对象
realm = Realm.getDefaultInstance();
initView();
initData();
}
下面我们来看看常见的操作,添加数据,这里添加数据是直接以对象的形式去存储数据的,也就是说,同一个对象,如果存到了realm数据库中,那就是相当于同一张表,不能有重复的主键了,只要操作数据库对象,我们要开启事务,否则会报异常,而且开启后操作完成后要关闭事务,我们来看看添加数据的代码:
realm.beginTransaction();//开启事务
realm.copyToRealm(bean);
realm.commitTransaction();//提交事务
这里的bean对象必须extends RealmObject对象,否则便无法存储这个对象的数据,还有一点有点坑的就是感觉序列化好像失效了,我尝试过,发现序列化的方法与这个继承RealmObject是有冲突的,这点还是有点问题;
下面我们来看看删除的方法,删除整个类的数据:
realm.beginTransaction();//开启事务
realm.deleteAll(Bean.class);
realm.commitTransaction();//提交事务
修改数据的话,我们查询到数据库中的对象的时候,直接如下更新即可:
realm.beginTransaction();
realm.copyToRealmOrUpdate(bean);
realm.commitTransaction();
对于查询数据,只要给出查询条件即可:
RealmResults<Bean> editCheckedEntities = realm.where(Bean.class).findAll();
RealmResults<Bean> editCheckedEntities = realm.where(Bean.class).equalsTo("字段名",字段值).findAll();
最后,有时候我们操作数据库的时候,数据量太大,导致我们对数据的操作需要花费一定的时间的时候,我们需要开启子线程,但是realm对数据库的调用的时候,Realm只能在同一线程中使用,因此Realm提供了一个异步调用的方法,下面我们来看看:
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
for (XjTimeListBean bean1416 : _$1387BeanXtask) {
bean1416.setGWDM(finalI.getCrewCode());
realm.copyToRealm(bean1416);
//我们在这里做耗时操作,即子线程
}
}
});
三、关于Realm的认识
对于这个数据库的项目,由于数据比较多,导致当要加载一个三级列表的时候,由于三级列表的数据是存放在数据库中的,所以中间有一些数据转化的操作,数据量一旦大之后,在主线程操作大量数据后,界面显得有点卡顿,于是我想开启子线程去操作数据,但是Realm得到的数据不能跨线程使用,于是就有点坑了,最终选择了分批加载数据,解决了问题;所以使用了异步任务去操作数据库的数据;