一、关于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得到的数据不能跨线程使用,于是就有点坑了,最终选择了分批加载数据,解决了问题;所以使用了异步任务去操作数据库的数据;