Android Realm 使用

版权声明:没事随便转 https://blog.csdn.net/qq_41816123/article/details/84972725

为什么使用这个数据库呢?

1.易用:Ream 不是在SQLite基础上的ORM,它有自己的数据查询引擎。并且十分容易使用。
2.快速:由于它是完全重新开始开发的数据库实现,所以它比任何的ORM速度都快很多,甚至比SLite速度都要快。
3.跨平台:Realm 支持 iOS & OS X (Objective‑C & Swift) & Android。我们可以在这些平台上共享Realm数据库文件,并且上层逻辑可以不用任何改动的情况下实现移植。
4.高级:Ream支持加密,格式化查询,易于移植,支持JSON,流式api,数据变更通知等高级特性
5.可视化

第一步导入

1.在Project中的配置中导入
在这里插入图片描述

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

在这里插入图片描述
2.在Modulez中的配置文件导入
在这里插入图片描述

apply plugin: 'realm-android'

在这里插入图片描述

第二步创建module类(User.class)

package com.example.yuexia.myapprealm;

import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;

/**
 * Created by syt98 on 2018/12/11.
 */

public class User extends RealmObject{

    private String id;
    @PrimaryKey
    private String name;
    private String pwd;
    private int age;
    public User() {
    }
    public User(String id, String name, String pwd, int age) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

@PrimaryKey——表示该字段是主键
@Required——表示该字段非空
使用@Required可用于强行要求其属性不能为空,只能用于Boolean, Byte, Short, Integer, Long, Float, Double, String, byte[] 和 Date。在其它类型属性上使用 @Required修饰会导致编译失败。
具体的我就不细说了,哥们,找度娘脑补。

第三步引用数据库

1.默认引用

Realm.init(this);
Realm mRealm = Realm.getDefaultInstance();

2.RealmConfiguration来配置Realm

RealmConfiguration config = new RealmConfiguration.Builder() 
            .name("myrealm.realm") //文件名
            .schemaVersion(0) //版本号
            .build();
Realm realm = Realm.getInstance(config);

这其中支持的方法有:
Builder.name : 指定数据库的名称。如不指定默认名为default。
Builder.schemaVersion : 指定数据库的版本号。
Builder.encryptionKey : 指定数据库的密钥。
Builder.migration : 指定迁移操作的迁移类。
Builder.deleteRealmIfMigrationNeeded : 声明版本冲突时自动删除原数据库。
Builder.inMemory : 声明数据库只在内存中持久化。
build : 完成配置构建。
3.创建非持久化的Realm,也就是保持在内存中,应用关闭后就清除拉

RealmConfiguration myConfig = new RealmConfiguration.Builder(context) 
            .name("myrealm.realm")//保存在内存中
            .inMemory() .build();

4.关闭,释放资源

@Override 
protected void onDestroy() { 
    super.onDestroy();
    // Close the Realm instance. 
    realm.close(); 
}

第四步数据库操作基本方法

1.增

        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                User user = realm.createObject(User.class);
                user.setName("Gavin");
                user.setAge(23);
            }
        });

但是如果你像我一样设置了主键就需要这样

                realm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        User user = realm.createObject(User.class,"Yuexia");
                        user.setAge(19);
                    }
                });

2.删

                final User user= realm.where(User.class).equalTo("name","Yuexia").findFirst();
                realm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        user.deleteFromRealm();
                    }
                });

删除的样子大概就是先查在删除
3.改

                realm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        User user = realm.where(User.class)
                                .equalTo("name","Yuexia").findFirst();
                        user.setAge(12);
                    }
                });

修改和删除差不多,先找到你要修改的user在修改他的属性
4.查

RealmResults<User> userList = realm.where(User.class).findAll();

这是查询所有

第五步操作提升

1.增、删、改操作都是需要开启事务的
但是Realm还提供了另外一种开启事务进行数据库操作的方法

realm.beginTransaction();//开启事务
User user = mRealm.createObject(User.class);
user.setName("Gavin");
user.setId("3");
realm.commitTransaction();//提交事务

2.使用executeTransactionAsync
该方法会开启一个子线程来执行事务,并且在执行完成后进行结果通知

RealmAsyncTask transaction =  mRealm.executeTransactionAsync(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        User user = realm.createObject(User.class);
        user.setName("Eric");
        user.setId("4");
      }
}, new Realm.Transaction.OnSuccess() {
    @Override
    public void onSuccess() {
        //成功回调
      }
}, new Realm.Transaction.OnError() {
    @Override
    public void onError(Throwable error) {
        //失败回调
      }
});

注意:如果当Acitivity或Fragment被销毁时,在OnSuccess或OnError中执行UI操作,将导致程序奔溃 。用RealmAsyncTask .cancel();可以取消事务
在onStop中调用,避免crash

public void onStop () {
    if (transaction != null && !transaction.isCancelled()) {
        transaction.cancel();
      }
}

3.查询的进阶方法
findAllAsync——异步查询
findFirst ——查询第一条数据
equalTo ——根据条件查询
sum():对指定字段求和。
average():对指定字段求平均值。
min(): 对指定字段求最小值。
max() : 对指定字段求最大值。count : 求结果集的记录数量。
findAll(): 返回结果集所有字段,返回值为RealmResults队列
findAllSorted() : 排序返回结果集所有字段,返回值为RealmResults队列
between(), greaterThan(),lessThan(), greaterThanOrEqualTo() & lessThanOrEqualTo()
equalTo() & notEqualTo()
contains(), beginsWith() & endsWith()
isNull() & isNotNull()
isEmpty()& isNotEmpty()
聚合排序和or我就不一一介绍了

总结

小编只是初步学习了解了一些Realm并没有深入学习,感兴趣的可以看看
https://academy.realm.io/cn/posts/jp-simard-realm-core-database-engine/
有啥一些简单的问题可以一起讨论哦
QQ:2714730493

猜你喜欢

转载自blog.csdn.net/qq_41816123/article/details/84972725
今日推荐