轻量级mysql框架,Realm 移动 轻量级数据库框架

本文详细介绍了SQLiteOpenHelper在Android中的使用,包括创建数据库、升级、加密以及基本的增删改查操作。同时,对比介绍了 Realm 数据库作为 SQLite 的替代方案,其轻量级、速度快、现代数据库特性的优势,以及如何在Android应用中配置和使用Realm,包括数据模型的创建、事务处理、异步操作等。文章还提到了 Realm 的优点如支持JSON、数据变更通知,以及在数据库结构改变时的迁移策略。

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

首先 大家对SQLiteOpenHelper 这个类并不陌生 ,伴随着 你需要有DAO类 包括IMPL实现类!

SQLiteOpenHelper 涉及到创建表 数据库升级 ,数据库加密 ,数据的增删改查等。。。 sqllite 的多表联查 左链接 等等

数据库Realm,是用来替代sqlite的一种解决方案!

它有一套自己的数据库存储引擎,比sqlite更轻量级,拥有更快的速度,并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,自动数据同步,简单身份验证,访问控制,事件处理,最重要的是跨平台,目前已有Java,Objective C,Swift,React-Native,Xamarin这五种实现,但是他也有自己的缺点 例如 不能多表联查。。

不过我们主要来讲讲风靡中的Realm 框架 是如何使用的!

环境配置

在项目的build文件加上

buildscript {

repositories {

jcenter()

}

dependencies {

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

}

}

app的build 文件加上

apply plugin: 'realm-android'

application 自定义配置

.schemaVersion(1) 设置一个版本号,如果没设置,默认是0

.encryptionKey() 数据库加密

.deleteRealmIfMigrationNeeded() 迁移方案的一种,当数据库结构改变时,删除原数据库中的所有数据, 这在debug版本的时候非常有用,一旦应用上线,需要保留原数据数据,这个方案就不适用了。

.migration() 指定一个迁移方案,如果应用上线之后,数据库结构需要发生改变,可以通过配置Migration来解决,用于将原数据库中的数据迁移到新数据库中。

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

}

}

创建实体

public class Dog extends RealmObject {

private String name;

private int age;

@PrimaryKey

private String id;

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;

}

}

再往下 我们就说 增删改查的各个用法

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

realm.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);

}

});

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

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

}

});

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

Realm mRealm=Realm.getDefaultInstance();

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

mRealm.beginTransaction();

dog.setName(newName);

mRealm.commitTransaction();

(1)查询全部

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

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;

}

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

}

其他相关说明

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值