您的位置:首页 > 移动开发 > Android开发

在Android加入和使用Realm

2015-11-18 13:04 363 查看
原文链接:Up and Running With Realm for Android

介绍

如果你比较关心android开发的最新动态的话,那么你肯定会听说过Realm,Realm是一个轻量级的数据库,在Android开发中,它可以替代SQLiteORM框架。

和SQLite相比,Realm速度更快并且它有很多先进的特性,例如对JSON的支持,流畅的API,数据变化通知(观察者),加密支持… 所有的这一切都会让android开发者日子过得更潇洒(这里扯淡了,开发者日子怎么可能潇洒,当然也可能是国内外不同…)。

这篇文章的主题就是Realm for Android, 在这篇文章中,我将使用Realm v0.84.1

将Realm添加到项目

要在Android项目中使用Realm, 你需要在module的build.gradle文件中添加如下代码:

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


创建一个Realm

一个Realm和SQLite比较类似。它有一个文件和他作为关联,这个文件一次创建,就会永久存在Android系统中。

想要创建一个Realm, 你可以在任意一个
Activity
中调用静态方法
Realm.getInstance


Realm myRealm = Realm.getInstance(context);


需要注意的是,我们这样创建,没有给它指定
RealmConfiguration
,这时候创建的文件会使用默认的文件名default.realm

如果你需要创建另外一个Realm,那你就必须要给它传递
RealmConfiguration.Builder
了,并且要给它指定一个唯一的名称。

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


创建RealmObject

如果一个javabean继承了
RealmObject
,那么它就可以用来存储Realm,如果你想知道什么是javabean,来看看这里的定义:javabean是可序列化的,有一个默认的构造方法,成员变量都提供getter和setter方法。例如,下面的代码可以轻松的保存到Realm中,

public class Country extends RealmObject {

private String name;
private int population;

public Country() { }

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getPopulation() {
return population;
}

public void setPopulation(int population) {
this.population = population;
}

}


可以使用
@PrimaryKey
注解来表示这个一个成员变量是Realm的主键。例如下面的代码是将
code
字段作为主键,

@PrimaryKey
private String code;

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}


创建事务

你将会在下面的代码中发现,使用Realm查询数据非常简单, 写入数据稍稍麻烦点。Realm遵循ACID以保证操作的原子性和一致性。在Realm中,所有的写操作都会在一个事务中。

使用
beginTransaction
方法可以开启一个事务,使用
commitTransaction
方法去提交一个事务。下面的代码表明如何创建并保存一个
Country


myRealm.beginTransaction();

// Create an object
Country country1 = myRealm.createObject(Country.class);

// Set its fields
country1.setName("Norway");
country1.setPopulation(5165800);
country1.setCode("NO");

myRealm.commitTransaction();


你可能已经注意到了,
country1
对象并不是使用
Country
的构造方法创建的,想让
RealmObject
保存这个实例, 就必须使用
createObject
方法创建。

如果你必须要使用构造方法的话,别忘了在提交事务之前调用
copyToRealm
方法将对象关联到
Realm
上,例如:

// Create the object
Country country2 = new Country();
country2.setName("Russia");
country2.setPopulation(146430430);
country2.setCode("RU");

myRealm.beginTransaction();
Country copyOfCountry2 = myRealm.copyToRealm(country2);
myRealm.commitTransaction();


查询

Realm提供了一套非常直观简单的API用来查询操作,调用
Realm
where
方法,并且将你需要的类的class传递进去, 你就完成了一个查询的创建,之后, 你可以调用
findAll
方法来遍历所有的数据,返回的数据保存在
RealmResults
对象中,下面的例子,我们查询出来并且打印了所有的
Country


RealmResults<Country> results1 =
myRealm.where(Country.class).findAll();

for(Country c:results1) {
Log.d("results1", c.getName());
}

// Prints Norway, RussiaRealmResults<Country> results1 =
myRealm.where(Country.class).findAll();

for(Country c:results1) {
Log.d("results1", c.getName());
}

// Prints Norway, Russia


除此之外, 你还可以使用
beginsWith
endsWith
lesserThan
greaterThan
方法来过滤结果,下面的例如展示了如何使用
greaterThan
方法来查询所有的
population
大于1亿的
Country


RealmResults<Country> results2 =
myRealm.where(Country.class)
.greaterThan("population", 100000000)
.findAll();

// Gets only Russia


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

// Sort by name, 降序排列
RealmResults<Country> results3 =
myRealm.where(Country.class)
.findAllSorted("name", false);

// Gets Russia, Norway


想要学习更多关于
Realm
的知识,可以参考官方文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: