Realm 出来这么久了,一直没时间巩固,今天就花点时间巩固下吧。
在没接触Realm之前,基本都是用Sqlite,现在都抛弃Sqlite了,相对于Sqlite来说,Realm更快并且具有很多现代数据库的特性,支持JSON,流式api等,数据变更通知,以及加密支持,这些都为安卓开发者带来了方便。当然,现在Realm支持的语言挺多的,更多。
一.添加依赖
classpath "io.realm:realm-gradle-plugin:2.0.2"
添加Android 配置
apply plugin: 'realm-android'
二.创建数据库
创建数据库有两种方法:
1、使用默认的配置:
Realm.init(this); //默认配置 RealmConfiguration configuration = new RealmConfiguration.Builder().build(); Realm.setDefaultConfiguration(configuration);2、自定义配置:
//自定义配置 RealmConfiguration configuration = new RealmConfiguration.Builder() .name("myRealm.realm") .deleteRealmIfMigrationNeeded() .build(); Realm.setDefaultConfiguration(configuration);注意:使用默认配置,系统也会生成一个d efault.realm的Realm文件.
三、添加数据
1.创建实体,继承RealmObject
public class Dog extends RealmObject { @PrimaryKey private String id; private String name; private int age; 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; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
Realm遵循 ACID (数据库事务正确执行的四个基本要素的缩写)规范,为了确保原子性和一致性,它强制所有的写入操作都在一个事务中执行。
Realm myRealm = Realm.getDefaultInstance(); myRealm.beginTransaction(); Dog dog = myRealm.createObject(Dog.class); dog.setName("小狗"); dog.setAge(2); myRealm.commitTransaction();
Dog dog = new Dog(); dog.setName("小狗"); dog.setAge(2); myRealm.beginTransaction(); Dog dog1 = myRealm.copyToRealm(dog); myRealm.commitTransaction();
四、查询
查询数据使用RealmResults<T>,查询所有数据或者条件查询都行,当然,你也可以对查询的结果进行排序
public List<Dog> queryAllDog() { RealmResults<Dog> dogs = mRealm.where(Dog.class).findAll(); /** * 对查询结果,按Id进行排序,只能对查询结果进行排序 */ //增序排列 // dogs=dogs.sort("id"); //降序排列 // dogs=dogs.sort("id", Sort.DESCENDING); return mRealm.copyFromRealm(dogs); }
public Dog queryById(String id) { Dog dog = mRealm.where(Dog.class).equalTo("id", id).findFirst(); return dog; }
五、删除
删除操作就简单了
Dog dog = mRealm.where(Dog.class).equalTo("id", id).findFirst(); mRealm.beginTransaction(); dog.deleteFromRealm(); mRealm.commitTransaction();六、改
Dog dog = mRealm.where(Dog.class).equalTo("id", id).findFirst(); mRealm.beginTransaction(); dog.setName(newName); mRealm.commitTransaction();以上都是基于同步操作的,有时候项目里面会用到异步操作
比如异步添加:
RealmAsyncTask addTask= mRealm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm realm) { realm.copyToRealm(cat); } }, new Realm.Transaction.OnSuccess() { @Override public void onSuccess() { ToastUtil.showShortToast(mContext,"添加成功"); } }, new Realm.Transaction.OnError() { @Override public void onError(Throwable error) { ToastUtil.showShortToast(mContext,"添加失败"); } });
异步查询
RealmResults<Cat> cats=mRealm.where(Cat.class).findAllAsync(); cats.addChangeListener(new RealmChangeListener<RealmResults<Cat>>() { @Override public void onChange(RealmResults<Cat> element) { element= element.sort("id"); List<Cat> datas=mRealm.copyFromRealm(element); } });
可跟的查询条件:
//可跟查询条件 //.or() 或者 //.beginsWith() 以xxx开头 //.endsWith() 以xxx结尾 //.greaterThan() 大于 //.greaterThanOrEqualTo() 大于或等于 //.lessThan() 小于 //.lessThanOrEqualTo() 小于或等于 //.equalTo() 等于 //.notEqualTo() 不等于 //.findAll() 查询所有 //.average() 平均值 //.beginGroup() 开始分组 //.endGroup() 结束分组 //.between() 在a和b之间 //.contains() 包含xxx //.count() 统计数量 //.distinct() 去除重复 //.findFirst() 返回结果集的第一行记录 //.isNotEmpty() 非空串 //.isEmpty() 为空串 //.isNotNull() 非空对象 //.isNull() 为空对象 //.max() 最大值 //.maximumDate() 最大日期 //.min() 最小值 //.minimumDate() 最小日期 //.sum() 求和
其他操作照葫芦画瓢。
这里说明一下Realm支持的一些数据类型:
boolean, byte, short, int, long, float, double, String, Date and byte[],在Realm中byte, short, int, long最终都被映射成long类型
Realm中也可以使用注解:
@PrimaryKey
1.在数据库里面就是主键的意思,字段必须是String、 integer、byte、short、 int、long 以及它们的封装类Byte, Short, Integer, and Long
2.使用了该注解之后可以使用copyToRealmOrUpdate()方法,通过主键查询它的对象,如果查询到了,则更新它,否则新建一个对象来代替
3.使用了该注解将默认设置@index注解,查询数据会快一点
@Required
数据不能为null
@Ignore
忽略,即该字段不被存储到本地
@Index
为这个字段添加一个搜索引擎,这将使插入数据变慢、数据增大,但是查询会变快。建议在需要优化读取性能的情况下使用。
demo:https://github.com/hedongBlog/DemoRealm