Realm官方文档笔记(一)

来源:互联网 发布:java游戏破解合集 编辑:程序博客网 时间:2024/06/04 00:49

Realm是一个数据库,特点是简单高效跨平台,今天记录一下看Realm官方文档的笔记

一 安装配置

首先要求Android studio版本要大于等于1.5.1,JDK的版本要求是大于等于7的,支持Android 2.3以上的版本

首先配置,添加路径:在项目的build.gradle中添加

dependencies {        classpath "io.realm:realm-gradle-plugin:1.2.0"    }
其次还要在应用的build.gradle中添加
apply plugin: 'realm-android'


二 Models

一个实体类需要继承extends RealmObject,在实体类中既可以有setter和getter方法,还可以有自定义方法,支持 public,protected and private(不知道为什么是不是以前的版本,网上有一部分人说不支持自定义方法和只支持private属性),这是文档原文:A Realm model class also supportspublic,protected and private, and fields as well as custom methods.

Realm支持字段类型包括:boolean/ byte/ short /int/ long /float /double /String /Date/ byte[]这么多种,整数类型byte/short/int/long在Realm中映射为相同类型

Realm会自动更新数据,不需要刷新或者更新UI,可以订阅通知,当数据修改时,知道UI应该被刷新

@index是索引属性,会使插入很慢但是查询很快,当只优化读取性能时可以添加索引,支持boolean/ byte/ short /int/ long /String /Date

@PrimaryKey设为主键,使用主键可以使它使用copyToRealmOrUpdate()方法,寻找该主键现有对象,调用copyToRealmOrUpdate时没有主键会抛出异常

@Ignore不被保存在磁盘上


三 写操作(插入 删除 修改)

1.创建对象

创建对象有两种方式:通过createObject直接实例化,或者通过构造器创建,注意,第二种需要先创建对象实例在使用realm.copyToRealm实现

Realm realm = Realm.getDefaultInstance();realm.beginTransaction();User user = realm.createObject(User.class); // 直接创建user.setName("John");user.setEmail("john@corporation.com");realm.commitTransaction();User user = new User("John");//Model User extends RealmObjectuser.setEmail("john@corporation.com");realm.beginTransaction();User realmUser = realm.copyToRealm(user);//构造器创建realm.commitTransaction();

写操作可以提交和取消,提交时写入磁盘,取消时所有更改都会丢弃

当然创建过程还能在简洁一点,就是使用realm.executeTransaction()方法,自动处理开始,提交,和取消

realm.executeTransaction(new Realm.Transaction() {@Overridepublic void execute(Realm realm) {User user = realm.createObject(User.class);user.setName("John");user.setEmail("john@corporation.com");}});


写操作注意阻塞的问题,同时字两个UI和后台写操作会发生ANR错误(无响应),所以最好异步执行写操作,当写操作打开时读操作不阻塞线程,提交后自动更新

使用realm.executeTransactionAsync()方法异步执行

realm.executeTransactionAsync(new Realm.Transaction() {            @Override            public void execute(Realm bgRealm) {                User user = bgRealm.createObject(User.class);                user.setName("John");                user.setEmail("john@corporation.com");            }        }, new Realm.Transaction.OnSuccess() {            @Override            public void onSuccess() {                // Transaction was a success.            }        }, new Realm.Transaction.OnError() {            @Override            public void onError(Throwable error) {                // Transaction failed and was automatically canceled.            }        });

onSuccess和onError都是可选的,不是必须要写的,异步事物是RealmAsyncTask的对象

RealmAsyncTask transaction = realm.executeTransactionAsync(new Realm.Transaction() {}
通过transaction.cancel()可取消待处理的事物


四 查询

查询结果是RealmResults对象,他是有序的可以通过索引访问单个对象

RealmResults<User> result2 = realm.where(User.class)                                  .equalTo("name", "John")                                  .or()                                  .equalTo("name", "Peter")                                  .findAll();

where是表示在哪个类中查询,equalTo是查询条件,name=John,findAll表示查询获取全部符合条件的对象

也可以用括号组括住你要查询的条件beginGroup()相当于左括号,endGroup()相当于右括号

可以给查询结果进行排序

RealmResults<User> result = realm.where(User.class).findAll();result = result.sort("age"); // Sort ascendingresult = result.sort("age", Sort.DESCENDING);
一个RealmResults还有多种聚合方式,如下
RealmResults<User> results = realm.where(User.class).findAll();long   sum     = results.sum("age").longValue();long   min     = results.min("age").longValue();long   max     = results.max("age").longValue();double average = results.average("age");

删除可以用deleteFromRealm()


查询也可以是异步的

异步查询时要注册回调

RealmResults<User> result = realm.where(User.class).findAllAsync();private RealmChangeListener callback = new RealmChangeListener() {    @Override    public void onChange(RealmResults<User> results) {        // called once the query complete and on every update    }};public void onStart() {    result.addChangeListener(callback);}public void onStop () {    result.removeChangeListener(callback); // remove a particular listener    // or    result.removeChangeListeners(); // remove all registered listeners}
大概有个了解了,关于线程JSON之类的下一篇再说

0 0
原创粉丝点击