Realm的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31433525/article/details/79067266

Realm 是一个移动数据库,可运行于手机、平板和可穿戴设备之上。可以让你的应用更快速,带来难以想象的体验。其目标是为了代替 CoreData 和 SQLite 数据库。
Realm非常易用,不是在SQLite基础上的ORM,它有自己的数据查询引擎。是完全重新开发的数据库,速度非常快,并且支持跨平台,数据加密,数据迁移,支持json,流式api等
官网
realm优缺点介绍
现在已经有了realm的可视化工具,realm Studio,支持查看本地.realm文件或连接到Realm服务器.下载地址
在Application初始化

 Realm.init(this);
        RealmConfiguration configuration = new RealmConfiguration.Builder().name("test.realm").build();
        Realm.setDefaultConfiguration(configuration);

在想要使用的时候调用,记得不用时关闭。

 realm  = Realm.getDefaultInstance();

Do类

public class User extends RealmObject{
    @PrimaryKey
    private String id;
    private int age;
    @Required
    private String name;
    private RealmList<Dog> dogRealmList;
    //省略set,get
 private String name;
    private int age;
    private boolean isFale;

realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                //创建对象,由于有主键需要加上参数,因为realm不能自增,所有使用uuid代替
                User user = realm.createObject(User.class, UUID.randomUUID().toString());
                user.setAge(18);
                user.setName("谁谁谁");
                RealmList<Dog> dogs = new RealmList<>();
                for(int i=0;i<3;i++){
                    Dog dog = realm.createObject(Dog.class);
                    dog.setAge(5);
                    dog.setFale(true);
                    dog.setName("小白"+i);
                    dogs.add(dog);
                }
                user.setDogRealmList(dogs);
                //由于有主键使用copyToRealmOrUpdate
                realm.copyToRealmOrUpdate(user);
            }
        });

user表
user表
dog表
dog表
点击user表中的list of dog 显示内部dog,这就是realm的关联
关联

通过json添加数据,并且实现异步操作

 realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                String json = "{id:\"123\",age:5,name:\"szh\",dogRealmList:[{name:\"hh\",age:2,isFale:false},{name:\"sss\",age:4,isFale:false}]}";
                realm.createObjectFromJson(User.class,json);
            }
        }, new Realm.Transaction.OnSuccess() {
            @Override
            public void onSuccess() {
                System.out.println("success");
            }
        }, new Realm.Transaction.OnError() {
            @Override
            public void onError(Throwable error) {
                System.out.println("error");
                System.out.println(error);
            }
        });

删除只能删除一张表上的数据,如我删除user,但dog数据没有删

  realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                //先查询再删除
                RealmResults<User> result= realm.where(User.class).findAll();
                result.get(4).deleteFromRealm();//删除指定位置(第4条记录)的记录
                result.deleteFromRealm(4);//删除指定位置(第4条记录)的记录
                result.deleteFirstFromRealm(); //删除user表的第一条数据
                result.deleteLastFromRealm();//删除user表的最后一条数据
                result.deleteAllFromRealm();//删除user表的全部数据
            }
        });

 realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                //先查询后更改
                RealmResults<Dog> result = realm.where(Dog.class).equalTo("name","hh").findAll();
                for(Dog dog : result){
                    dog.setAge(20);
                }
            }
        });

findAll —- 查询满足条件的所有记录
findAllAsync—-异步查询(当数据量较大,可能会引起ANR的时候,就可以使用findAllAsync)
findFirst —- 查询第一条数据
equalTo —- 根据条件查询(多次使用该函数可以实现多条件查询)
sum —- 对指定字段求和。
average —- 对指定字段求平均值。
min —- 对指定字段求最小值。
max —- 对指定字段求最大值。count : 求结果集的记录数量。
findAll —- 返回结果集所有字段,返回值为RealmResults队列
findAllSorted —- 排序返回结果集所有字段,返回值为RealmResults队列
between —- 指定字段的值在某区间内
greaterThan()|lessThan()—-指定字段的值大于(小于)给定的值
greaterThanOrEqualTo() & lessThanOrEqualTo()—-指定字段的值大于等于(小于等于)给定的值
equalTo() & notEqualTo() —- 指定字段的值(不)等于
contains() —-指定字段的值包含某些字符(指定字段为String)
beginsWith() & endsWith() —-指定字段的值以给定的值开始(结束)
isNull() & isNotNull() —-指定字段的值(不)为null
isEmpty() & isNotEmpty() —-指定字段的值(不)为空
contains() —字符串包含
beginsWith() —字符串以xx开头
endsWith() —字符串以xx结尾
like() —字符串匹配

 realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                RealmResults<User> users = realm.where(User.class).findAllSorted("id", Sort.DESCENDING);//按照id倒序排序
                long size = users.size();//返回数据的条数
                double average = users.average("age");//返回查询结果的中age的平均值
                long sum = users.sum("age").longValue();//返回查询结果中age的总数
                long min = users.min("age").longValue();//返回查询结果中age的最小值
                long max = users.max("age").longValue();//返回查询结果中age的最大值
                System.out.println(size);
                System.out.println(average);
                System.out.println(sum);
                System.out.println(min);
                System.out.println(max);

            }
        });

数据库版本升级

版本升级时注意要将原本的model也更改掉,版本号更改掉(可以保留原数据)或者干脆使用.deleteRealmIfMigrationNeeded()当版本冲突时删除原数据库(不能保留原数据)

RealmConfiguration configuration = new RealmConfiguration.Builder().name("test.realm")
                .schemaVersion(1)
                .migration(new CustomMigration())
                .build();
        Realm.setDefaultConfiguration(configuration);
public class CustomMigration implements RealmMigration{
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        RealmSchema schema = realm.getSchema();
        if(oldVersion == 0 && newVersion == 1){
           RealmObjectSchema userScheme =  schema.get("User");
            userScheme.addField("money",String.class, FieldAttribute.REQUIRED)
                    .transform(new RealmObjectSchema.Function() {
                        @Override
                        public void apply(DynamicRealmObject obj) {
                            obj.set("money","11");
                        }
                    }).removeField("age");//记得同时删掉model中的age,不然调用时会报异常
            oldVersion++;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_31433525/article/details/79067266
今日推荐