关于Android数据库orm工具库对比的几点思考(三)

来源:互联网 发布:矩阵非奇异是什么意思 编辑:程序博客网 时间:2024/05/17 07:21

一、前言

在我正式接触到Android数据库orm框架的时候,我有把github上的所有优秀的orm数据库项目都撸了一遍,保留了几个自己感兴趣并且适用于现在的项目中,这些框架中,有些在我前两篇博文中已经提到过,但是今天厉害了,我要介绍一个文件式数据库——Realm,一个简便的数据库。

二、Realm的简介

移动端的数据库,适用于 Phone、Tablet、Wearable,支持 ORM,线程安全、支持连表及数据库加密,比 SQLite 性能更好
项目地址:https://github.com/realm/realm-java
文档介绍:http://realm.io/docs/java/0.72.0/

如果你比较关心Android开发的最新动态的话,那么你肯定会听说过Realm,Realm是一个轻量级的数据库,在Android开发中,它可以替代SQLite和ORM框架。Realm是一款开源的数据库工具,它具有快速,易于使用和支持多平台的特点.它完全可以取代我们Android中的SQLite数据库,它比SQLite使用起来更加的方便快捷.

和SQLite相比,Realm速度更快并且它有很多先进的特性,例如对JSON的支持,流畅的API,数据变化通知(观察者),加密支持…,最令人感动的当然属于它详细的文档Realm文档 ,感兴趣的可以点击阅读。

二、Realm的使用

(一)将Realm添加到项目

想在Android的项目当中使用Realm,只需在依赖文件app/build.gradle下的dependencies节点添加依赖即可。

compile 'io.realm:realm-android:0.84.1'

(二)创建Realm对象

Realm和Sqlite类似,都是以文件数据库的方式而存在,一个Realm相当于一个SQLite数据库。它有一个与之对应的文件,一旦创建将持久保存在安卓的文件系统中。要创建一个新的Realm,你可以在任意Activity中调用静态方法Realm.getInstance。

Realm myRealm = Realm.getInstance(context);

通过Realm.getInstance()方法可以得到一个Realm对象,同时也会在Android文件系统中创建一个名为default.realm的Realm文件.我们还可以通过RealmConfiguration.Builder对象来创建自己命名的Realm对象。

Realm myOtherRealm =        Realm.getInstance(new RealmConfiguration.Builder(context)                        .name("myRealm.realm")                        .build());

(三)创建RealmObject

如果一个javabean继承了RealmObject,那么它就可以用来存储Realm。

public class Dog extends RealmObject {    private String name;    private int age;    // ... 构造方法和getter(),setter()方法 ...}

还可以为对象属性指定primary key

public class Person extends RealmObject {    @PrimaryKey    private long id;    private String name;    // ... Generated getters and setters ...}

(四)对RealmObject进行操作

要将数据存储到Realm上就需要进行事务操作,虽然从一个Realm读取数据非常简单(下一节有讲),但是向它写入数据就稍微复杂一点。Realm遵循 ACID (数据库事务正确执行的四个基本要素的缩写)规范,为了确保原子性和一致性,它强制所有的写入操作都在一个事务中执行。要开始一个新的事务,使用beginTransaction方法。类似地,要结束这个事务,使用commitTransaction方法。
下面是一个简单的例子:

myRealm.beginTransaction();// Create an objectDog dog1 = myRealm.createObject(Dog.class); // Set its fieldsdog1.setName("Rose");dog1.setAge(7);myRealm.commitTransaction();

通过Realm的createObject()方法创建的对象,并不是通过它的构造函数创建的.这是为了让Realm可以管理RealmObject的实例。如果你想通过构造函数创建对象,最后别忘了使用Realm的copyToRealm()方法将对象与RealmObject关联。

Dog dog2 = new Dog();dog2.setName("Lily");dog2.setAge(4);myRealm.beginTransaction();Dog copyOfDog = myRealm.copyToRealm(dog2);myRealm.commitTransaction();

Realm的查询操作就简单多了,通过使用where()方法关联相应的
Realm提供了一套非常直观简单的API用来查询操作,调用Realm的where方法,并且将你需要的类的class传递进去, 你就完成了一个查询的创建,之后, 你可以调用findAll方法来遍历所有的数据,返回的数据保存在RealmResults对象中。

RealmResults<Dog> results1 =        myRealm.where(Dog.class).findAll();for(Dog d:results1) {    Log.d("results1", d.getName());}// Prints Jack, Mike

除此之外, 你还可以使用beginsWithendsWithlesserThangreaterThan方法来过滤结果,若想得到age小于4的Dog对象,我们可以这样操作

RealmResults<Dog> results2 =        myRealm.where(Dog.class)                .lesserThan("age", 4)                .findAll();// 得到 Mike

如果你想让查询结果按照某个顺序来,你可以使用findAllSorted方法,它有一个String类型的参数和一个boolean类型的参数,其中,String指定用来排序的字段,boolean指定了排序方式。

RealmResults<Dog> results3 =        myRealm.where(Dog.class)                .findAllSorted("name", false);

(五)事务操作

第一种方式:

realm.beginTransaction(); realm.copyToRealm(dog); realm.commitTransaction();

第二种方式(异步线程执行):

realm.executeTransactionAsync(new Realm.Transaction() {       @Override           public void execute(Realm realm) {                        Dog theDog = realm.where(Dog.class).equals("age", 1).findFirst();                theDog.setAge(3);                      }                  }, new Realm.Transaction.Callback() {             @Override               public void onSuccess() {            //自动更新原始数据           dog.getAge();                      }                 });

四、总结

Realm确实是一个非常前沿的数据库框架,跟其它ORM的千篇一律不同,它提供了强大的功能和可靠的速度,它的优点可以作如下总结:

  1. 效率高,因为是自己实现的C++数据库,与SQLite底层使用java不同,它天生就比其高效快速。维护Realm数据库还能带来平台无关性,iOS、Android等平台都可以共享数据库。

  2. Auto-Refresh,Realm为每个实体创建了代理类,并且实现了其Getter/Setter,因此,每次得到或者修改实体的值,都是直接对底层数据库进行的操作,官方将其称为”懒加载”。

    写到这里,关于框架介绍已经围绕greenDao、OrmLite、Realm展开,前两个可以回溯看我的其他博文,最后一篇将会以一个之前很火的orm框架结尾,并且在这几个框架之间做最后对比,尽情期待…

0 0