Android数据库---Realm

简介

Realm 大部分代码都是开源的,但是其强大功能取决于隐藏在平台内部的一个核心数据库引擎,这个引擎完全由 C++ 编写而成。

Realm 本质上是一个嵌入式数据库,但是它也是看待数据的另一种方式。它用另一种角度来重新看待你移动应用中的模型和业务逻辑。

Realm 最核心的理念就是对象驱动,这是 Realm 的核心原则。

简单来说,Realm有自己独立的引擎,跟Sqlite完全不同。
Realm主要是用与数据库关联对象的实例来操作,并且增删改都要在事务中进行。
例如在项目中有个User数据类,继承RealmObject:

User user = new User();
realm.beginTransation();
realm.copyToRealm(user);
// 对user对象的操作就是修改数据库中对应的数据
realm.commitTransation();

Realm不支持主键自动增长


image.png

image.png

查看官方文档,建议创建对象实例,设置主键,再copyToRealm关联对象。

懒加载


image.png

官方建议是写操作不在UI线程执行,否则有阻塞的可能。


image.png

在删除数据库记录时,数据库文件可能不会及时被清理,可以调用compactRealm释放可以释放的磁盘空间


image.png

使用(官方说明文档)

创建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 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 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");
        }
    });
}

你可能感兴趣的:(Android数据库---Realm)