下面我将介绍在Android Studio上快速使用Realm数据库
在你项目的build.gradle中:
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
//这里使用3.0.0版本,方便下面的stetho可查,不需要则可使用最高的realm版本
classpath "io.realm:realm-gradle-plugin:3.0.0"
}
在你app的build.gradle中:
apply plugin: 'realm-android'
//如果想直接查到你的realm数据库,需做如下配置
在你项目的build.gradle中:
repositories {
maven {
url 'https://github.com/uPhyca/stetho-realm/raw/master/maven-repo'
}
}
在你app的build.gradle中:
implementation 'com.facebook.stetho:stetho:1.5.0'
implementation 'com.uphyca:stetho_realm:2.1.0'
如上操作后则可使用谷歌浏览器输入此链接chrome://inspect/#devices,可以查到realm数据库中的数据
在Application的onCreate()方法中初始化Realm
//初始化Realm
private void initRealm() {
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder().name("myrealmsql.realm").deleteRealmIfMigrationNeeded().build();
Realm.setDefaultConfiguration(config);
Stetho.initialize(//Stetho初始化
Stetho.newInitializerBuilder(this)
.enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
.enableWebKitInspector(RealmInspectorModulesProvider.builder(this).build())
.build()
);
}
数据库操作
打开数据库:
Realm mRealm=Realm.getDefaultInstance();
关闭数据库:
if (mRealm != null && !mRealm.isClosed()) { mRealm.close(); }
一.添加对象入数据库(增)
copyToRealmOrUpdate这个方法用来添加对象进数据库(适用于有主键的model),如果数据库中存在,则更新数据库
copyToRealm这个方法也是添加对象入数据库(适用于没有主键的model,有主键的model也可以使用这个方法),不能更新数据库只能创建,重复添加会报错(主键已存在的错误)
1.copyToRealm与copyToRealmOrUpdate:前者是给未指明主键的model使用的,后者则是给指明主键的model使用。
2.copyToRealm对应无主键参数的createObject,区别是copyToRealm会复用Realm缓存的model示例,不会每次都创建新的model实例。
3.copyToRealmOrUpdate对应有主键参数的createObject,区别是copyToRealmOrUpdate会复用Realm缓存的model示例,没有缓存实例就要去表中查询是否有匹配这个主键存在的记录,来决定是新建对象还是更新model实例。
二.删除对象(删)
先查到,再删
BeanDb db=selectSceneResult(id);
db.deleteFromRealm();
三.修改对象(改)
可以使用copyToRealmOrUpdate方法整条更新,只要主键KEY一样;
copyToRealmOrUpdate(db);
也可以逐条更新
先从数据库查出,再更新对象的字段
BeanDb db=selectImageResult(id);
mRealm.beginTransaction();
db.setName("Alvis");
mRealm.commitTransaction();
四.查询对象(查)
查询单条:根据主键查询(唯一的)
mRealm.where(BeanDb.class).equalTo("keyId",id).findFirst();
查询多条:根据条件查询(可能不是唯一的)
mRealm.where(BeanDb.class).equalTo("name",Alvis).findAll(); 返回的是一个数组可能多条;
注意:
Intent传递Realm对象,不能实现serializable接口,因为Realm的代理类未实现serializable接口。
解决办法:实现cloneable或者Parcelable接口