关于数据库,几乎是项目必备。还记得从最初的MySQL到GreenDao,从SQL语句到对对象映射。讲真的,数据库对客户端来说属于隐形的一大块,数据库技术很深,但是如果只是简单的增删改查的话还好。
之前一直用的是Greendao,增删改查以及版本更新。也没有什么太大的问题,如果有的话,几乎在网上都能找到,如果找不到那就是自己代码的问题。
现在接手的新项目中,使用的Realm数据库,讲真的,我之前一点都没用过这个。
Realm文档 (请查看)
介绍就是
Realm是一个嵌入式数据库,是一个MVCC(多版本并发控制)数据库。他比SQLite轻量级,执行效率更高,使用更加方便
。它实现了零拷贝、内部加密等,并且支持JSON、流式api、Rxjava等。当然也兼容ACID,并且跨平台。
待续(今晚要回去、兄弟们国庆节快乐)
------------------------------------------------------------------------------------------------------------------------------------------------------------------
接入Realm
1.在项目的build.gradle
/*数据库 Realm*/
classpath "io.realm:realm-gradle-plugin:5.8.0"
2.在app.gradle
apply plugin: 'realm-android'
PS:到此就可以了。但是我遇到了一个错误,直接运行崩溃。(这个问题待续,创建一个新的项目就没问题,应该是我的测试项目配置问题吧)
java.lang.NoClassDefFoundError: Failed resolution of: Lio/realm/Realm;
增删改查就直接按照文档的代码就OK。接下来demo操作几个比较有意思的点。
/**
* 初始化 数据库
*/
private void initRealm() {
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder()
.name("test.realm")
.encryptionKey(getKey())
.schemaVersion(1)
.modules(new VideoModule())
.readOnly()
.inMemory()
.migration(new VideoMigration())
.deleteRealmIfMigrationNeeded()//声明版本冲突时自动删除原数据库
.build();
Realm.setDefaultConfiguration(config);
}
(1)name:数据库的名字
(2)encryptionKey:加密
(3)schemaVersion:数据库版本号
(4)modules:可以理解为名字为video.realm的数据库所持有的表
(5)migration:顾名思义,升级用的。
(6)deleteRealmIfMigrationNeeded:这个配置很邪乎
(7)readOnly:只读领域,顾名思义这是一个只能读的数据库
PS:亲测有效(配置只读领域去进行写操作——报错信息)
Caused by: java.lang.IllegalStateException: Only Realms provided using 'assetFile(path)' can be marked read-only. No such Realm was provided.
(8)isMemory:内存领域(完全在内存中而不会持久化到磁盘,如果内存不足的话可能仍会使用磁盘,但是应用程序关闭将删除数据)
private void createData() {
Realm instance = Realm.getDefaultInstance();
instance.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.createObjectFromJson(UserModule.class, "{ name:\"Super含(1)\", age: \"18\" ,id:2 }");
}
});
UserModule userModule1 = instance.where(UserModule.class).findFirst();
Log.i("Realm","name = " + userModule1.name +"------" + "age = " + userModule1.age);
}
运行结果
2019-10-14 21:19:11.72 11289-11289/? I/Realm: name = Super含(1)------age = 18
步骤:1.升级配置版本号 2.写自己的升级类并且实现RealmMigration之后重写migrate方法
/**
* 初始化 数据库
*/
private void initRealm() {
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder()
.name("test.realm")
.schemaVersion(2)
.migration(new MyMigration())
.build();
Realm.setDefaultConfiguration(config);
}
PS:如果版本号更改,但是在MyMigration中没有什么改变的话会报错。
Caused by: io.realm.exceptions.RealmMigrationNeededException: Migration is required due to the following errors:
写MyMigration
public class MyMigration implements RealmMigration {
/**
* @param realm Realm对象
* @param oldVersion 老版本号
* @param newVersion 新版本号
*/
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
RealmSchema schema = realm.getSchema();
if (oldVersion == 1) {
schema.get("UserModule")
.addField("sex", String.class)
.addField("weight", String.class);
oldVersion++;
}
}
}
查询更新后的数据库
private void createData() {
Realm instance = Realm.getDefaultInstance();
instance.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.createObjectFromJson(UserModule.class, "{ name:\"Super含(2)\", age: \"18\" ,id:4 ,sex:\"男\", weight:\"122\" }");
}
});
RealmResults realmResults = instance.where(UserModule.class).findAll();
for (UserModule userModule : realmResults) {
Log.i("Realm", "name = " + userModule.name + "--" + "age = " + userModule.age + "--" + "sex = " + userModule.sex + "--" + "weight = " + userModule.weight);
}
}
结果
2019-10-14 21:21:03.722 25792-25792/com.developers.genseeplayer I/Realm: name = Super含(1)--age = 18--sex = null--weight = null
2019-10-14 21:21:03.722 25792-25792/com.developers.genseeplayer I/Realm: name = Super含(2)--age = 18--sex = 男--weight = 122
PS:用过GreenDao的都知道,数据库升级还是有点东西的。
END、
Realm数据库系列
Android 数据库 Realm 使用教程讲解指南(二)