Android 数据库 Realm 使用教程讲解指南(一)

 

关于数据库,几乎是项目必备。还记得从最初的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操作几个比较有意思的点。

1.Realm配置

 /**
     * 初始化 数据库
     */
    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:内存领域(完全在内存中而不会持久化到磁盘,如果内存不足的话可能仍会使用磁盘,但是应用程序关闭将删除数据)

 

2.Realm有意思的地方

(1)直接使用Json格式作为数据源。

 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

 

(2)数据库升级

步骤: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<UserModule> 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 使用教程讲解指南(二)

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值