Realm 基本用法

前提

Android Studio 1.5.1 或者更高版本; JDK 版本 >=7; 较新的 Android SDK 版本; 支持 Android API 9 以上的所有版本(Android 2.3 Gingerbread 及以上)。

为什么使用Realm

Realm Java 让你能够高效地编写 app 的模型层代码,保证你的数据被安全、快速地存储。

1、Realm基本配置

A.在module的build.gradle中添加如下代码:

apply plugin: 'realm-android'

如图所示:

1.png

B.在project的build.gradle中添加如下代码:

 classpath "io.realm:realm-gradle-plugin:3.5.0"

如图所示:

1.png

现在基本配置已经弄好了,可以开始操作一波了。

2、数据库基本操作(增删改查)

在做这些操作之前我们需要新建model类(类似sqlite的新建表),这里我们需要继承RealmObject才能被存储在数据库中。

public class Person extends RealmObject{
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
       this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

表已经建好了,这时候可以对它CRUD(create/read/update/delete)了。 a.新增数据 这里需要说一下,新增数据操作需要在事务进行。如下所示:

        Realm mRealm = Realm.getDefaultInstance();//获取Realm实例              
        mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                //Add a person
                Person person = realm.createObject(Person.class);
                person.setId(1);
                person.setName("Young Person");
                person.setAge(14);
            }
        });

或者

 Realm mRealm = Realm.getDefaultInstance();//获取Realm实例   
 mRealm.beginTransaction();
 //Add a person
 Person person = realm.createObject(Person.class);
 person.setId(1);
 person.setName("Young Person");
 person.setAge(14);
 mRealm.commitTransaction();

b.查询数据

Realm mRealm = Realm.getDefaultInstance();//获取Realm实例   
final Person person = mRealm.where(Person.class).findFirst();//查询第一条数据

相关查询API如下所示:
1️⃣ average(String fieldName) ->返回给定字段的平均值
2️⃣ beginGroup ->开始条件分组(“左括号”)
3️⃣ beginsWith(String fieldName,String value) ->查询以“value”开头的“fieldName”
4️⃣ between(String fieldName,float from,float to) ->查询fieldName字段在"from"和to之间

好了,方法挺多的,这里就举几个例子,顺便给出Realm API网址(https://realm.io/docs/java/3.5.0/api/)有兴趣的可以去看一下。

c.更新数据

Realm mRealm = Realm.getDefaultInstance();//获取Realm实例   
final Person person = mRealm.where(Person.class).findFirst();//查询第一条数据
//更新第一条数据
 mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                person.setName("Senior Person");
                person.setAge(88);
            }
        });

d.删除数据

Realm mRealm = Realm.getDefaultInstance();//获取Realm实例   
mRealm.executeTransaction(new Realm.Transaction() {
   @Override
    public void execute(Realm realm) {
        //清空Person表
        realm.delete(Person.class);
    }
 });

3、数据库迁移(数据库升级)

所有数据库都要处理模型改变的情况。Realm 的数据模型用标准 Java 对象来定义,改变数据模型只需要改变数据对象定义即可。 Application中需要如下自定义配置:

  // Initialize Realm. Should only be done once when the application starts.
  Realm.init(this);
  RealmConfiguration myConfig=new RealmConfiguration.Builder()
                .schemaVersion(REALM_VERSION)
                .migration(new MyConfigMigration())
                .name("myrealm.realm")
                .build();
  Realm.setDefaultConfiguration(myConfig);

这时候我们需要自定义Migration

public class MyConfigMigration implements RealmMigration {
    public static final String TAG = "ez";

    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {

        realmUpdate((int) oldVersion,realm);

        //官方写法
//        if (oldVersion == 0 && newVersion == 1) {
//            version1(realm);
//            ++oldVersion;
//        }
//
//        if (oldVersion == 1 && newVersion == 2) {
//            version2(realm);
//            ++oldVersion;
//        }

    }

    /**
     * realm数据库迁移(升级)
     * 降级:需要使用if判断来处理
     * @param oldVersion
     * @param realm
     */
    private void realmUpdate(int oldVersion, DynamicRealm realm) {
        switch (oldVersion) {
            case 0:
                version1(realm);
            case 1:
                version2(realm);
            default:
                break;
        }
    }

    /**
     * version=1时,增加fullName,删除name。
     * <p>
     * 注意:添加字段时,对应的model也要对应添加(如果标记的不为空,那么model也必须注解不为空),删除字段时,对应的model也要删除,
     *
     * @param realm
     */
    private void version1(DynamicRealm realm) {
        RealmSchema schema = realm.getSchema();
        RealmObjectSchema personSchema = schema.get("Person");
        personSchema.addField("fullName", String.class, FieldAttribute.REQUIRED)
                .transform(new RealmObjectSchema.Function() {

                    @Override
                    public void apply(DynamicRealmObject obj) {
                        obj.set("fullName", obj.get("name") + "Full");
                    }
                })
                .removeField("name");
    }

    /**
     * version=2时,增加了Pet类。
     */
    private void version2(final DynamicRealm realm) {
        RealmSchema schema = realm.getSchema();
        //创建对应表和表字段
        RealmObjectSchema petSchema = schema.create("Pet")
                .addField("name", String.class, FieldAttribute.REQUIRED)
                .addField("type", String.class, FieldAttribute.REQUIRED);
        //将创建的表添加到Person表中
        schema.get("Person")
                .addRealmListField("pets", petSchema)
                .transform(new RealmObjectSchema.Function() {
                    @Override
                    public void apply(DynamicRealmObject obj) {
                        if (obj.getString("fullName").equals("Senior PersonFull")) {
                            DynamicRealmObject pet = realm.createObject("Pet");
                            pet.setString("name", "Jemos");
                            pet.setString("type", "cat");
                            obj.getList("pets").add(pet);
                        }
                    }
                });
    }
}

当我们每次增加schemaVersion的值时,数据库就会走升级操作。 好了,上面就是Realm的基本用法。详细用法请参考官网: a、中文版(版本3.1.1)https://realm.io/cn/docs/java/latest/#migrations b、英文版(版本3.5.0)https://realm.io/docs/java/latest/ c、官方Realm使用Demo https://github.com/realm/realm-java

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xiaoheike

mybatis 自动生成代码(mybatis generator)

在MyBatis GeneratorXML Configuration File中添加你需要用到的<plugin>元素:

1792
来自专栏菩提树下的杨过

ehcache2.8.3入门示例:hello world

一、pom.xml 依赖项 1 <dependency> 2 <groupId>net.sf.ehcache</groupId> ...

2007
来自专栏技术小讲堂

WCF中数据契约之已知类型的几种公开方式代码中定义配置中定义宿主端使用解析器

WCF中传输的数据不想传统的面向对象编程,它只传递了一些对象的属性,但是自身并不知道自己属于什么对象,所以,他没有子类和父类的概念,因而也就没有Is-a的关系,...

2693
来自专栏Android开发与分享

【Android】Realm详解

47611
来自专栏不会写文章的程序员不是好厨师

日志那些事儿——Logback源码解析

在上篇文章日志漫谈中谈到,日志在监控报警、查错分析等方面有着非常重要的应用。Logback作为目前最火的日志系统,本文就简单分析一下logback日志打印的过程...

1221
来自专栏james大数据架构

C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息

C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度。不然获取到的结果总是只有第一字符。本人就是由于这个原因,折腾了很久。在此...

1887
来自专栏13blog.site

Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例

前言 前一篇文章《Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试》讲了不为和不能两个状态,针对不为,只能自己调整心态了,...

2835
来自专栏aoho求索

Java SPI机制详解

2122
来自专栏battcn

一起来学SpringBoot | 第八篇:通用Mapper与分页插件的集成

在一起来学SpringBoot | 第七篇:整合Mybatis一文中,我们介绍了 Mybatis这款优秀的框架,顺便提及了民间大神开发的两款插件( 通用Mapp...

742
来自专栏博岩Java大讲堂

Java日志体系(slf4j)

4676

扫码关注云+社区