为什么使用这个数据库呢?
1.易用:Ream 不是在SQLite基础上的ORM,它有自己的数据查询引擎。并且十分容易使用。
2.快速:由于它是完全重新开始开发的数据库实现,所以它比任何的ORM速度都快很多,甚至比SLite速度都要快。
3.跨平台:Realm 支持 iOS & OS X (Objective‑C & Swift) & Android。我们可以在这些平台上共享Realm数据库文件,并且上层逻辑可以不用任何改动的情况下实现移植。
4.高级:Ream支持加密,格式化查询,易于移植,支持JSON,流式api,数据变更通知等高级特性
5.可视化
第一步导入
1.在Project中的配置中导入
classpath "io.realm:realm-gradle-plugin:2.2.1"
2.在Modulez中的配置文件导入
apply plugin: 'realm-android'
第二步创建module类(User.class)
package com.example.yuexia.myapprealm;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
/**
* Created by syt98 on 2018/12/11.
*/
public class User extends RealmObject{
private String id;
@PrimaryKey
private String name;
private String pwd;
private int age;
public User() {
}
public User(String id, String name, String pwd, int age) {
this.id = id;
this.name = name;
this.pwd = pwd;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
@PrimaryKey——表示该字段是主键
@Required——表示该字段非空
使用@Required可用于强行要求其属性不能为空,只能用于Boolean, Byte, Short, Integer, Long, Float, Double, String, byte[] 和 Date。在其它类型属性上使用 @Required修饰会导致编译失败。
具体的我就不细说了,哥们,找度娘脑补。
第三步引用数据库
1.默认引用
Realm.init(this);
Realm mRealm = Realm.getDefaultInstance();
2.RealmConfiguration来配置Realm
RealmConfiguration config = new RealmConfiguration.Builder()
.name("myrealm.realm") //文件名
.schemaVersion(0) //版本号
.build();
Realm realm = Realm.getInstance(config);
这其中支持的方法有:
Builder.name : 指定数据库的名称。如不指定默认名为default。
Builder.schemaVersion : 指定数据库的版本号。
Builder.encryptionKey : 指定数据库的密钥。
Builder.migration : 指定迁移操作的迁移类。
Builder.deleteRealmIfMigrationNeeded : 声明版本冲突时自动删除原数据库。
Builder.inMemory : 声明数据库只在内存中持久化。
build : 完成配置构建。
3.创建非持久化的Realm,也就是保持在内存中,应用关闭后就清除拉
RealmConfiguration myConfig = new RealmConfiguration.Builder(context)
.name("myrealm.realm")//保存在内存中
.inMemory() .build();
4.关闭,释放资源
@Override
protected void onDestroy() {
super.onDestroy();
// Close the Realm instance.
realm.close();
}
第四步数据库操作基本方法
1.增
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
User user = realm.createObject(User.class);
user.setName("Gavin");
user.setAge(23);
}
});
但是如果你像我一样设置了主键就需要这样
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
User user = realm.createObject(User.class,"Yuexia");
user.setAge(19);
}
});
2.删
final User user= realm.where(User.class).equalTo("name","Yuexia").findFirst();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
user.deleteFromRealm();
}
});
删除的样子大概就是先查在删除
3.改
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
User user = realm.where(User.class)
.equalTo("name","Yuexia").findFirst();
user.setAge(12);
}
});
修改和删除差不多,先找到你要修改的user在修改他的属性
4.查
RealmResults<User> userList = realm.where(User.class).findAll();
这是查询所有
第五步操作提升
1.增、删、改操作都是需要开启事务的
但是Realm还提供了另外一种开启事务进行数据库操作的方法
realm.beginTransaction();//开启事务
User user = mRealm.createObject(User.class);
user.setName("Gavin");
user.setId("3");
realm.commitTransaction();//提交事务
2.使用executeTransactionAsync
该方法会开启一个子线程来执行事务,并且在执行完成后进行结果通知
RealmAsyncTask transaction = mRealm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
User user = realm.createObject(User.class);
user.setName("Eric");
user.setId("4");
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
//成功回调
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
//失败回调
}
});
注意:如果当Acitivity或Fragment被销毁时,在OnSuccess或OnError中执行UI操作,将导致程序奔溃 。用RealmAsyncTask .cancel();可以取消事务
在onStop中调用,避免crash
public void onStop () {
if (transaction != null && !transaction.isCancelled()) {
transaction.cancel();
}
}
3.查询的进阶方法
findAllAsync——异步查询
findFirst ——查询第一条数据
equalTo ——根据条件查询
sum():对指定字段求和。
average():对指定字段求平均值。
min(): 对指定字段求最小值。
max() : 对指定字段求最大值。count : 求结果集的记录数量。
findAll(): 返回结果集所有字段,返回值为RealmResults队列
findAllSorted() : 排序返回结果集所有字段,返回值为RealmResults队列
between(), greaterThan(),lessThan(), greaterThanOrEqualTo() & lessThanOrEqualTo()
equalTo() & notEqualTo()
contains(), beginsWith() & endsWith()
isNull() & isNotNull()
isEmpty()& isNotEmpty()
聚合排序和or我就不一一介绍了
总结
小编只是初步学习了解了一些Realm并没有深入学习,感兴趣的可以看看
https://academy.realm.io/cn/posts/jp-simard-realm-core-database-engine/
有啥一些简单的问题可以一起讨论哦
QQ:2714730493