Realm官方文档笔记(一)

这篇博客介绍了Realm数据库的基础知识,包括安装配置要求、实体类定义、字段类型以及写操作和查询方法。 Realm支持多种数据类型,并自动更新数据。插入、删除和修改数据需注意避免并发写操作导致的ANR错误,建议异步执行。查询可以通过条件组合、排序并支持异步执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 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之类的下一篇再说

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值