realm android,Android realm 相关使用教程

这篇博客介绍了 Realm,一种替代 sqlite 的轻量级数据库解决方案,具有更快的速度和现代数据库特性。文章详细阐述了 Realm 的环境配置,包括在 build.gradle 文件中添加依赖和在 app 的 build 文件应用插件。接着,讲解了如何在 Application 的 onCreate 方法中初始化 Realm,以及如何创建具有主键和多对多关系的实体。此外,还详细说明了 Realm 的增删改查操作,包括事务处理、异步操作等。最后,提到了 Realm 的查询功能,如条件查询、排序和聚合函数的使用。

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

一、Realm简介

数据库Realm,是用来替代sqlite的一种解决方案,它有一套自己的数据库存储引擎,比sqlite更轻量级,拥有更快的速度,并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,自动数据同步,简单身份验证,访问控制,事件处理,最重要的是跨平台,目前已有Java,Objective C,Swift,React-Native,Xamarin这五种实现。相关地址

5c9a53c7ffdd?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Realm

二、环境配置

(1) 在项目的 build.gradle 文件中添加如下 class path 依赖。

5c9a53c7ffdd?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

项目的 build.gradle

buildscript {

repositories {

jcenter()

}

dependencies {

classpath "io.realm:realm-gradle-plugin:2.0.2"

}

}

(2) 在app的build文件加上

5c9a53c7ffdd?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

app的build

apply plugin: 'realm-android'

三、初始化Realm

(1) 在Application的oncreate()方法中Realm.init()

public class MyApplication extends Application {

@Override

public void onCreate() {

super.onCreate(); Realm.init(this);

}

}

(2)在Application的oncreate()方法中对Realm进行相关配置

①使用默认配置

public class MyApplication extends Application {

@Override

public void onCreate() {

super.onCreate();

// The Realm file will be located in Context.getFilesDir() with name "default.realm"

Realm.init(this);

RealmConfiguration config = new RealmConfiguration.Builder().build();

Realm.setDefaultConfiguration(config);

}

}

②使用自定义配置

public class MyApplication extends Application {

@Override

public void onCreate() {

super.onCreate();

Realm.init(this);

RealmConfiguration config = new RealmConfiguration.Builder() .name("myRealm.realm") .deleteRealmIfMigrationNeeded() .build();

Realm.setDefaultConfiguration(config);

}

}

(3)在AndroidManifest.xml配置自定义的Application

四、创建实体

(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;

}

}

多对多的关系:

public class Contact extends RealmObject {

public String name;

public RealmList emails;

public class Email extends RealmObject {

public String address;

public boolean active;

}

}

(2)其他相关说明

1、支持的数据类型:

boolean, byte, short, int, long, float, double, String, Date and byte[]

在Realm中byte, short, int, long最终都被映射成long类型

2、注解说明

@PrimaryKey

①字段必须是String、 integer、byte、short、 int、long 以及它们的封装类Byte, Short, Integer, and Long

②使用了该注解之后可以使用copyToRealmOrUpdate()方法,通过主键查询它的对象,如果查询到了,则更新它,否则新建一个对象来代替。

③使用了该注解将默认设置(@index)注解

④使用了该注解之后,创建和更新数据将会慢一点,查询数据会快一点。

@Required

数据不能为null

@Ignore

忽略,即该字段不被存储到本地

@Index

为这个字段添加一个搜索引擎,这将使插入数据变慢、数据增大,但是查询会变快。建议在需要优化读取性能的情况下使用。

五、增

(1)实现方法一:事务操作

类型一 :新建一个对象,并进行存储

Realm realm=Realm.getDefaultInstance();

realm.beginTransaction();

User user = realm.createObject(User.class); // Create a new object

user.setName("John");

user.setEmail("john@corporation.com");

realm.commitTransaction();

类型二:复制一个对象到Realm数据库

Realm realm=Realm.getDefaultInstance();

User user = new User("John");

user.setEmail("john@corporation.com");

// Copy the object to Realm. Any further changes must happen on

realmUserrealm.beginTransaction();

realm.copyToRealm(user);

realm.commitTransaction();

(2)实现方法二:使用事务块

Realm mRealm=Realm.getDefaultInstance();

final User user = new User("John");

user.setEmail("john@corporation.com");

mRealm.executeTransaction(new Realm.Transaction() {

@Override

public void execute(Realm realm) {

realm.copyToRealm(user);

}

});

六、删

Realm mRealm=Realm.getDefaultInstance();

final RealmResults dogs= mRealm.where(Dog.class).findAll(); mRealm.executeTransaction(new Realm.Transaction() {

@Override

public void execute(Realm realm) {

Dog dog=dogs.get(5);

dog.deleteFromRealm();

//删除第一个数据

dogs.deleteFirstFromRealm();

//删除最后一个数据

dogs.deleteLastFromRealm();

//删除位置为1的数据

dogs.deleteFromRealm(1);

//删除所有数据

dogs.deleteAllFromRealm();

}

});

同样也可以使用同上的beginTransaction和commitTransaction方法进行删除

七、改

Realm mRealm=Realm.getDefaultInstance();

Dog dog = mRealm.where(Dog.class).equalTo("id", id).findFirst();

mRealm.beginTransaction();

dog.setName(newName);

mRealm.commitTransaction();

同样也可以用事物块来更新数据

八、查

(1)查询全部

查询结果为RealmResults

public List queryAllDog() {

Realm mRealm=Realm.getDefaultInstance();

RealmResults dogs = mRealm.where(Dog.class).findAll();

return mRealm.copyFromRealm(dogs);

}

(2)条件查询

public Dog queryDogById(String id) {

Realm mRealm=Realm.getDefaultInstance();

Dog dog = mRealm.where(Dog.class).equalTo("id", id).findFirst();

return dog;

}

常见的条件如下(详细资料请查官方文档):

between(), greaterThan(), lessThan(), greaterThanOrEqualTo() & lessThanOrEqualTo()

equalTo() & notEqualTo()

contains(), beginsWith() & endsWith()

isNull() & isNotNull()

isEmpty() & isNotEmpty()

(3)对查询结果进行排序

/**

* query (查询所有)

*/

public List queryAllDog() {

RealmResults dogs = mRealm.where(Dog.class).findAll();

/**

* 对查询结果,按Id进行排序,只能对查询结果进行排序

*/

//增序排列

dogs=dogs.sort("id");

//降序排列

dogs=dogs.sort("id", Sort.DESCENDING);

return mRealm.copyFromRealm(dogs);

}

(4)其他查询

sum,min,max,average只支持整型数据字段

/**

* 查询平均年龄

*/

private void getAverageAge() {

double avgAge= mRealm.where(Dog.class).findAll().average("age");

}

/**

* 查询总年龄

*/

private void getSumAge() {

Number sum= mRealm.where(Dog.class).findAll().sum("age");

int sumAge=sum.intValue();

}

/**

* 查询最大年龄

*/

private void getMaxId(){

Number max= mRealm.where(Dog.class).findAll().max("age");

int maxAge=max.intValue();

}

九、异步操作

大多数情况下,Realm的增删改查操作足够快,可以在UI线程中执行操作。但是如果遇到较复杂的增删改查,或增删改查操作的数据较多时,就可以子线程进行操作。

(1)异步增:

private void addCat(final Cat cat) {

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,"收藏失败");

}

});

}

最后在销毁Activity或Fragment时,要取消掉异步任务

@Override

protected void onDestroy() {

super.onDestroy();

if (addTask!=null&&!addTask.isCancelled()){

addTask.cancel();

}

}

(2)异步删

private void deleteCat(final String id, final ImageView imageView){

RealmAsyncTask deleteTask= mRealm.executeTransactionAsync(new Realm.Transaction() {

@Override

public void execute(Realm realm) { Cat cat=realm.where(Cat.class).equalTo("id",id).findFirst(); cat.deleteFromRealm(); } }, new Realm.Transaction.OnSuccess() {

@Override

public void onSuccess() {

ToastUtil.showShortToast(mContext,"取消收藏成功"); }

}, new Realm.Transaction.OnError() {

@Override

public void onError(Throwable error) {

ToastUtil.showShortToast(mContext,"取消收藏失败"); }

}); }

最后在销毁Activity或Fragment时,要取消掉异步任务

@Override

protected void onDestroy() {

super.onDestroy();

if (deleteTask!=null&&!addTask.isCancelled()){

deleteTask.cancel();

}

}

(3)异步改

RealmAsyncTask updateTask= mRealm.executeTransactionAsync(new Realm.Transaction() {

@Override

public void execute(Realm realm) { Cat cat=realm.where(Cat.class).equalTo("id",mId).findFirst(); cat.setName(name); } }, new Realm.Transaction.OnSuccess() {

@Override

public void onSuccess() {

ToastUtil.showShortToast(UpdateCatActivity.this,"更新成功"); } }, new Realm.Transaction.OnError() {

@Override

public void onError(Throwable error) { ToastUtil.showShortToast(UpdateCatActivity.this,"失败成功");

}

});

最后在销毁Activity或Fragment时,要取消掉异步任务

@Override

protected void onDestroy() {

super.onDestroy();

if (updateTask!=null&&!addTask.isCancelled()){

updateTask.cancel();

}

}

(4)异步查

RealmResults cats=mRealm.where(Cat.class).findAllAsync(); cats.addChangeListener(new RealmChangeListener>() { @Override

public void onChange(RealmResults element) {

element= element.sort("id");

List datas=mRealm.copyFromRealm(element);

}

});

最后在销毁Activity或Fragment时,要取消掉异步任务

@Override

protected void onDestroy() {

super.onDestroy();

cats.removeChangeListeners();

}

我也是看着realm 的官方文档自己理解写出来的相关用法,如果有什么不对的地方希望大家一起讨论一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值