Realm数据库之开发探索一

本篇博客是继Realm数据库之简要介绍的下篇

主要讲解 realm 2.3.0版本在项目中集成的步骤


安装

Step1:project级别的build.gradle文件添加

1
2
3
4
5
6
7
8
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:2.3.0"
}
}

(注:上面2.3.0是2017年2月7日对应的官方最新版本号,你可以更改为你需要的版本号)

Step2:application级别的build.gradle文件添加

1
apply plugin: 'realm-android'

ProGuard 混淆相关

1
Realm 已经集成了 ProGuard 的配置。您不需要针对 Realm 做 ProGuard 的改动。

编写代码

创建需要数据库操作的model对象

  • 方式1:继承自RealmObject (例如:以下是我创建的User对象)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class User extends RealmObject{
    private int userId;
    @Required//这里的意思是不允许存入为null的值
    private String userName;
    @Ignore //这里的意思是忽略的属性,将不保存该属性到数据库
    private String userPwd;
    //...
    //这里省略了get set 等方法
    }
  • 方式2:实现自RealmModel(代码如下)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class User implements RealmModel {
    private int userId;
    @Required//这里的意思是不允许存入为null的值
    private String userName;
    @Ignore //这里的意思是忽略的属性,将不保存该属性到数据库
    private String userPwd;
    //...
    //这里省略了get set 等方法
    }
    这里你需要了解的:
  • model类还支持公共的、受保护的和私有字段以及自定义方法。
  • Realm支持的数据类型有:boolean, byte, short, int, long, float, double, String, Date and byte[].
  • RealmObject 是实时的、自动更新的底层数据的映射视图。您不需要去重新获得对象已取得其最新版本。对于数据的改动会即时反应到相关的对象或者查询结果。
  • 以下是两者调用RealmObject对象方法上的区别,示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
// With RealmObject
user.deleteFromRealm(); // 删除数据库中的当前对象
user.isValid(); // 当前对象是否存在与数据库中
user.isLoaded(); // 异步查询操作时,用于判断操作是否完成
//... 更多方法
user.addChangeListener(listener); // 对当前对象在数据库被更改作监听事件

// With RealmModel
RealmObject.deleteFromRealm(user);
RealmObject.isValid(user);
RealmObject.isLoaded(user);
//... 更多方法
RealmObject.addChangeListener(user, listener);

(即后者在RealmObject对象上调用的方法只能通过静态方法的形式去调用)

简单的增删查改

方法一:事务操作
  • 方式一 :新建一个对象,并存储
    1
    2
    3
    4
    5
    Realm realm=Realm.getDefaultInstance();
    realm.beginTransaction();
    User user = realm.createObject(User.class); // Create a new object
    user.setUserName("Luck");
    realm.commitTransaction();
  • 方式二:复制一个对象到Realm数据库
    1
    2
    3
    4
    5
    6
    7
    Realm realm=Realm.getDefaultInstance();
    User user = new User();
    user.setUserName("Luck");
    // Copy the object to Realm. Any further changes must happen on realmUser
    realm.beginTransaction();
    realm.copyToRealm(user);
    realm.commitTransaction();
    方法二:使用事务块
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Realm  mRealm=Realm.getDefaultInstance();
    final User user = new User();
    user.setUserName("Luck");
    mRealm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
    realm.copyToRealm(user);
    }
    });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Realm  mRealm=Realm.getDefaultInstance();
final RealmResults<User> users= mRealm.where(User.class).findAll();
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//删除位置为1的数据
users.deleteFromRealm(1);
//删除第一个数据
users.deleteFirstFromRealm();
//删除最后一个数据
users.deleteLastFromRealm();
//删除指定的User对象
User user=users.get(5);
user.deleteFromRealm();
//删除所有数据
users.deleteAllFromRealm();
}
});

(注:同样也支持使用beginTransaction和commitTransaction方法进行删除)

(注:查询结果为RealmResults,可以使用mRealm.copyFromRealm(User)方法将它转为List)

  • 查询全部

    1
    2
    3
    4
    5
    public List<User> queryAllUser() {
    Realm mRealm=Realm.getDefaultInstance();
    RealmResults<User> users = mRealm.where(User.class).findAll();
    return mRealm.copyFromRealm(users);
    }
  • 条件查询
    例如:

    1
    2
    3
    4
    5
    public User queryUserByUserName() {
    Realm mRealm=Realm.getDefaultInstance();
    User user = mRealm.where(User.class).equalTo("userName", "Luck").findFirst();
    return mRealm.copyFromRealm(user);
    }

    以下总结可以跟的查询条件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    //.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() 求和

    详细说明请戳这里

下面是对RealmResults数据,可以进行的一些实用数据操作

方法 作用 返回值数据类型
RealmResults.sort(“字段名fieldName”) 指定字段升序排序 RealmResults
RealmResults.sort(“字段名fieldName”,Sort.DESCENDING) 指定字段降序排序 RealmResults
RealmResults.average(“字段名fieldName”) 获取指定字段平均值 Number
RealmResults.max(“字段名fieldName”) 获取指定字段最大值 Number
RealmResults.min(“字段名fieldName”) 获取指定字段最小值 Number
RealmResults.minDate(“字段名fieldName”) 获取指定字段最小日期 Date
RealmResults.sum(“字段名fieldName”) 获取指定字段的和 Number

更多方法请戳這里

  • 同步
    1
    2
    3
    4
    5
    Realm  mRealm=Realm.getDefaultInstance();
    mRealm.beginTransaction();
    User user = mRealm.where(User.class).equalTo("userName", "Luck").findFirst();
    user.setName("newLuck");
    mRealm.commitTransaction();
  • 异步
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Realm realm = Realm.getDefaultInstance();
    RealmAsyncTask updateTask= realm.executeTransactionAsync(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
    User user = realm.where(User.class).equalTo("userName", "Luck").findFirst();
    user.setUserName("newLuck");
    }
    }, new Realm.Transaction.OnSuccess() {
    @Override
    public void onSuccess() {
    TSUtil.showInfo(context,"修改成功",false);
    }
    }, new Realm.Transaction.OnError() {
    @Override
    public void onError(Throwable error) {
    TSUtil.showInfo(context,"修改失败",false);
    }
    });
    对于Realm数据库的一些基本方法使用就介绍到这里了,如有不懂。欢迎评论或留言