简介
Realm 大部分代码都是开源的,但是其强大功能取决于隐藏在平台内部的一个核心数据库引擎,这个引擎完全由 C++ 编写而成。
Realm 本质上是一个嵌入式数据库,但是它也是看待数据的另一种方式。它用另一种角度来重新看待你移动应用中的模型和业务逻辑。
Realm 最核心的理念就是对象驱动,这是 Realm 的核心原则。
简单来说,Realm有自己独立的引擎,跟Sqlite完全不同。
Realm主要是用与数据库关联对象的实例来操作,并且增删改都要在事务中进行。
例如在项目中有个User数据类,继承RealmObject:
User user = new User();
realm.beginTransation();
realm.copyToRealm(user);
// 对user对象的操作就是修改数据库中对应的数据
realm.commitTransation();
Realm不支持主键自动增长
查看官方文档,建议创建对象实例,设置主键,再copyToRealm关联对象。
懒加载
官方建议是写操作不在UI线程执行,否则有阻塞的可能。
在删除数据库记录时,数据库文件可能不会及时被清理,可以调用compactRealm释放可以释放的磁盘空间
使用(官方说明文档)
创建Model
继承RealmObject来声明Realm数据模型
public class Shop extends RealmObject {
@PrimaryKey
private Long id;
//商品名称
private String name;
// get/set方法
}
除了继承RealmObject外,还可以实现RealmModel。使用实现RealmModel方式可以用RealmObject中的静态方法来操作数据。
@RealmClass
public class User implements RealmModel {
.......
}
事务
realm所有修改操作要开启事务(即查询无需开启事务),开启事务有两种方式
第一种是直接开启事务,第二种是使用事务回调方法
// 第一种 直接开启事务
realm.beginTransaction();
/* 数据库操作 */
realm.commitTransaction();
// 第二种 使用事务回调方法
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
/* 数据库操作 */
}
});
// 第二种还可以使用异步回调方法
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
/* 数据库操作 */
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
/* 数据库操作成功回调 */
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
/* 数据库操作失败回调 */
}
});
添加
realm添加有两种
第一种是用realm.createObject()创建关联实例对象
第二种是先创建对象,再用realm.copyToRealm()来关联实例对象
public void save() {
realm.beginTransaction();
// 第一种
Shop shop1 = realm.createObject(Shop.class);
// 第二种
Shop shop2 = new Shop();
realm.copyToRealm(shop2);
realm.commitTransaction();
}
删除
public void delete() {
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmResults<Shop> results = realm.where(Shop.class).findAll();
Shop shop = results.get(1);
if (shop != null) {
shop.deleteFromRealm();
//RealmObject.deleteFromRealm(shop);
}
results.deleteFromRealm(1);
}
});
}
查询
public void find() {
RealmResults<Shop> all = realm.where(Shop.class).findAll();
Shop shop = realm.where(Shop.class).equalTo("id", "1000").findFirst();
}
更新
public void update() {
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Shop shop = realm.where(Shop.class).equalTo("id", "1000").findFirst();
shop.setName("www");
}
});
}