关于Android数据库—realm的使用及理解

来源:互联网 发布:中国广电网络缴费 编辑:程序博客网 时间:2024/05/22 14:00

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

0 0
原创粉丝点击