Realm 数据库的简单使用

本文介绍了Realm数据库在Android中的应用,对比Sqlite强调其优势,如速度、现代数据库特性。详细讲述了如何添加依赖、创建数据库、添加数据、查询及删除操作,并提及了Realm支持的数据类型和关键注解的使用,如@PrimaryKey、@Required和@Index。

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

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.createObject(),一下是两种不同的方式:

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()                 ab之间  
//.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
    为这个字段添加一个搜索引擎,这将使插入数据变慢、数据增大,但是查询会变快。建议在需要优化读取性能的情况下使用。

了解更多就去官网 Realm Java

demo:https://github.com/hedongBlog/DemoRealm




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值