Realm
介绍
什么是ORM?
Android原生操作数据库的方式是这样的:首先定义一个类继承SQLiteOpenHelper,重写onCreate和onUpdate,后续对数据库的增删改查以及创建和销毁都需要操作相对比较底层的sql语句,难以记忆又容易出错,而且操作sql语句代码量多,sql语句的逻辑比较繁琐。
而Java是面向对象的语言,有没有一种方式可以让我们不去关心sql语句的编写,直接面向对象;我们操作对象就间接操作了数据库。那么orm数据库框架就是帮助我们完成这个事,并且能够将javabean和数据库的表映射起来,javabean的字段就是表的字段。这就是为什么叫o(对象)r(关系)m(映射)的原因。
为什么选择Realm?
目前主流的orm类库有:Realm,greenDao,DBFlow,Ormlite,xutil,afinal等;
Realm专为移动开发设计,并与其他主流库完美融合使用,功能强大,性能和效率都处于领先地位,因此我们选择学习它。
1. 添加依赖
首先,在project目录下的root build.gradle文件中添加如下:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:3.0.0"
}
}
其次,在module目录下的build.gradle文件中添加如下:
apply plugin: 'realm-android'
2. 定义model
创建model有2种方式:继承RealmObject;实现RealmModel接口
方式一,继承自RealmObject,如下:
public class User extends RealmObject {
public User(String name, int age) {
this.name = name;
this.age = age;
}
//1.当自定义构造函数时,必须有一个无参数构造
public User(){}
public String name;
public int age;
@Ignore //该字段不会被存储到db中
public int height;
//2.it can also have custom method...
public void sayName(){
Log.d("tag", "sayName: "+this.name);
}
}
方式二,实现RealmModel 接口,并添加注解@RealmClass,如下:
@RealmClass
public class User implements RealmModel {
public User(String name, int age) {
this.name = name;
this.age = age;
}
//1.当自定义构造函数时,必须有一个无参数构造
public User(){}
public String name;
public int age;
@Ignore //该字段不会被存储到db中
public int height;
3. 增删改查
增加
增加,删除和修改操作必须在事务(transaction)控制下进行,Realm进行事务操作有2种方式,异步和同步,推荐异步模式。
同步创建数据到Realm数据库,有2种写法:
//同步操作写法一:
realm.beginTransaction();
//会创建对象和user表
User user = realm.createObject(User.class);
//会自动更新表
user.name = "刘德华";
user.age = 55;
//提交事务,操作就被执行
realm.commitTransaction();
//同步操作写法二:
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//会创建对象和user表
User user = realm.createObject(User.class);
//会自动更新表
user.name = "刘德华";
user.age = 55;
}
});
异步创建数据,推荐异步的方式:
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
User user = realm.createObject(User.class);
//会自动更新表
user.name = "刘德华";
user.age = 55;
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
//操作成功
Log.e(TAG, "onSuccess: " );
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
//操作失败
Log.e(TAG, "onError: "+error.getMessage());
}
});
查询
RealmQuery query = realm.where(User.class);
RealmResults users = query.findAll();
if(users==null || users.size()==0){
Log.e(TAG, "query: no data!" );
}else{
Log.e(TAG, "query: size: "+users.size());
User user = users.get(0);
Log.e(TAG, "query: "+user.name );
}
删除
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmQuery query = realm.where(User.class);
RealmResults users = query.findAll();
users.get(0).deleteFromRealm();//删除元素
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
Log.e(TAG, "onSuccess: delete success" );
}
});
修改
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmQuery query = realm.where(User.class);
RealmResults users = query.findAll();
User user = users.get(0);
user.name = "张学友";
user.age = 10;
}
});
4. 过滤器(Filter)
Realm支持多种多样的过滤器,让数据操作更方便!
所有数据类型支持:
equalTo和notEqualTo
Number数据类型,包括Date支持:
between:两者之间
greaterThan:大于某个值
lessThan:小于某个值
greaterThanOrEqualTo:大于或等于
lessThanOrEqualTo:小于或等于
字符串类型支持:
contains:包含
beginsWith:以...开始
endsWith:以...结尾
like:类似于...