270  
查询码:00000944
关于Android数据库—realm的使用及理解
来源:https://blog.csdn.net/Jacky_Can/article/details/71909505?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.essearch_pc_relevant&spm=1001.2101.3001.4242
作者: 朱凡 于 2021年08月28日 发布在分类 / FM组 / FM_App 下,并于 2021年08月28日 编辑
数据 android 数据库 使用 我们 博客 操作 sqlite 对象 查询

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



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




 推荐知识

 历史版本

修改日期 修改人 备注
2021-08-28 21:00:01[当前版本] 朱凡 创建版本

 附件

附件类型

GIFGIF

知识分享平台 -V 4.8.7 -wcp