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

发布了57 篇原创文章 · 获赞 40 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37492806/article/details/101512384