Github官网(Java版):https://github.com/realm/realm-java
现在Realm的最新版是5.11.0
Realm的特点:
- 手机数据库:Realm是第一个手机数据库,数据库从基础搭建到运行都是在手机/平板/智能佩戴设备上。
- 使用简单:数据可以直接通过代码查询到,消除了对象关系映射ORM的性能和维护问题。使用直观方便,几分钟便可运行起来。
- 现代化:支持简单的线程安全、关系和加密。
- 快捷:realm维护一个非常丰富的特性集的时候都比任何原生SQLite的普通操作要快。
Realm 的配置:
https://blog.youkuaiyun.com/amberoot/article/details/90021774
Realm的简单使用:
一、配置MyApplication
1)创建MyApplication类并初始化Realm
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//初始化realm
Realm.init(this);
}
}
2)在 AndroidManifest.xml 文件中配置MyApplication
<application
android:name=".MyApplication"
...
...
二、具体使用
- 先创建Model类(下图栗子是类User),每个类代表着一个表格,类中的每个变量代表表格中的列,所以下面表格User中有Id\Name\Age\Career四列。Model类必须继承RealmObject才能使用realm。(标有@PrimaryKey的变量是这个表格的主键,主键是唯一的,而且主键类型必须是字符串或整型(int\byte\short\long)以及其包装类型(Int\Byte\Short\Long))
Id | Name | Age | Career |
public class User extends RealmObject{
@PrimaryKey
private int Id;
private String Name;
private String Age;
private String Career;
public int getId() {
return Name;
}
public void setId(int id) {
Id = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getage() {
return Age;
}
public void setAge(String age) {
Age = age;
}
public String getCareer() {
return Career;
}
public void setCareer(String career) {
Career = career;
}
}
- 在操作数据库前要先创建实例Realm
private Realm realm;
// 如果之前有实例运行,清Realm
//Realm.deleteRealm(Realm.getDefaultConfiguration());
// 创建一个空的实例Realm
realm = Realm.getDefaultInstance();
- Realm操作完成后要关掉哦(通常在onDesdroy操作)
@Override
protected void onDestroy() {
super.onDestroy();
realm.close();
}
- 在realm中利用Model类User创建一个不带主键的表格(realm所有写的操作必须在transaction包中,才能保证多线程安全)
//常用表达式
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.createObject(User.class);
}
});
//lambda表达式,更简洁
realm.executeTransaction(r -> r.createObject(User.class));
// RealmObjects with primary keys created with `createObject()` must specify the primary key value as an argument.
Command command = r.createObject(User.class, 0);
- 在realm中利用Model类User创建一个带主键的表格(主键是ID)
// RealmObjects with primary keys created with `createObject()` must specify the primary key value as an argument.
Command command = r.createObject(User.class, 0);
- 写Create(realm所有写的操作必须在transaction包中,才能保证多线程安全)
// realm所有写的操作必须在transaction包中,才能保证多线程安全
realm.executeTransaction(r -> {
// 创建表格并给主键赋予值,主键的值一旦被赋值就不能更改了
User user = r.createObject(User.class, 1);
//写
user.setName("Amberoot");
user.setAge("8");
user.setCareer("Engineer");
});
- 读Read (字符串区分大小写)
//查询指定表格所有列
RealmResults<User> users = realm.where(User.class).findAll();
//异步查询,即在后台线程进行查询操作
users = realm.where(User.class).findAllAsync();
//查询表格中有指定参数的数据--区分大小写
users = realm.where(User.class).equalTo("Name", "Amberoot").findAll();
//查询表格中的第一行
User user = realm.where(User.class).findFirst();
- 更新Update(可以在transaction包中操作)
User user = realm.where(User.class).findFirst();
realm.executeTransaction(r -> {
user.setName("Senior");
user.setAge(99);
user.setCareer("haha")
});
- 删除Delete
//删除表格中所有数据
realm.executeTransaction(r -> r.delete(User.class));
//删除表格中第一行数据
realm.executeTransaction(r -> users.deleteFirstFromRealm());
//删除表格中最后一行数据
realm.executeTransaction(r -> users.deleteLastFromRealm());
- OrderedRealmCollectionChangeListener(可以监听realm数据变化)
1)创建realmChangeListener
private final OrderedRealmCollectionChangeListener<RealmResults<User>> realmChangeListener = (user, changeSet) -> {
//监听数据插入
String insertions = changeSet.getInsertions().length == 0 ? "" : "\n - Insertions: " + Arrays.toString(changeSet.getInsertions());
//监听数据删除
String deletions = changeSet.getDeletions().length == 0 ? "" : "\n - Deletions: " + Arrays.toString(changeSet.getDeletions());
//监听数据变化
String changes = changeSet.getChanges().length == 0 ? "" : "\n - Changes: " + Arrays.toString(changeSet.getChanges());
};
2)添加realmChangeListener (通常在onCreate操作)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Realm.deleteRealm(Realm.getDefaultConfiguration());
realm = Realm.getDefaultInstance();
users = realm.where(User.class).findAllAsync();
//添加realmChangeListener
users.addChangeListener(realmChangeListener);
}
3) 完成后清除realmChangeListener(通常在onDesdroy操作)
@Override
protected void onDestroy() {
super.onDestroy();
//清除realmChangeListeners
users.removeAllChangeListeners();
realm.close();
}