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'
一个实体类需要继承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 RealmObject
user.setEmail("john@corporation.com");
realm.beginTransaction();
User realmUser = realm.copyToRealm(user);//构造器创建
realm.commitTransaction();
写操作可以提交和取消,提交时写入磁盘,取消时所有更改都会丢弃
当然创建过程还能在简洁一点,就是使用realm.executeTransaction()方法,自动处理开始,提交,和取消
realm.executeTransaction(new Realm.Transaction() {
@Override
public 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 ascending
result = 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之类的下一篇再说