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

Realm for Android快速入门教程

2015-12-28 09:31 417 查看


介绍

如果你关注安卓开发的最新趋势,你可能已经听说过Realm。Realm是一个可以替代SQLite以及ORMlibraries的轻量级数据库。

相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,以及加密支持,这些都为安卓开发者带来了方便。

在这篇快速入门教程中,你将学到Android版Realm的基础知识。本教程我们使用的是Realmv0.84.1。


1.添加Realm到工程

要在安卓工程中使用Realm,你需要在module的build.gradle文件中添加一个依赖:

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



2.创建一个Realm

一个Realm相当于一个SQLite数据库。它有一个与之对应的文件,一旦创建将持久保存在安卓的文件系统中。

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

1
RealmmyRealm=Realm.getInstance(context);


注意,调用Realm.getInstance,而没有传入RealmConfiguration,会创建一个叫做default.realm的Realm文件。

如果你想向app中添加另一个Realm,必须使用一个RealmConfiguration.Builder对象,并为Realm文件指定一个独有的名字。

1

2

3

4

5

6
RealmmyOtherRealm=


Realm.getInstance(


new
RealmConfiguration.Builder(context)


.name(
"myOtherRealm.realm"
)


.build()


);



3.创建一个RealmObject

只要继承了RealmObject类,任意JavaBean都能存储在Realm中。不知道JavaBean是什么?它就是一个可序列化的java类,有默认构造器,成员变量有相应的getter/setter方法。比如,下面这个类的实例就能轻松的存储在一个Realm中:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24
publicclassCountryextendsRealmObject{




privateStringname;


privateintpopulation;




publicCountry(){}




publicStringgetName(){


return
name;


}




publicvoidsetName(Stringname){


this
.name=name;


}




publicintgetPopulation(){


return
population;


}




publicvoidsetPopulation(intpopulation){


this
.population=population;


}




}


如果你想让RealmObject的一个成员变量作为主键,你可以使用@PrimaryKey注解。比如,这里演示了如何为Country类添加一个主键code:

1

2

3

4

5

6

7

8

9

10
@PrimaryKey


privateStringcode;




publicStringgetCode(){


return
code;


}




publicvoidsetCode(Stringcode){


this
.code=code;


}



4.创建transaction

虽然从一个Realm读取数据非常简单(下一节有讲),但是向它写入数据就稍微复杂一点。Realm遵循ACID(数据库事务正确执行的四个基本要素的缩写)规范,为了确保原子性和一致性,它强制所有的写入操作都在一个事务中执行。

要开始一个新的事务,使用beginTransaction方法。类似地,要结束这个事务,使用commitTransaction方法。

注:事务即英文里面的transaction。

这里演示了如何创建和保存一个Country类的实例:

1

2

3

4

5

6

7

8

9

10

11
myRealm.beginTransaction();




//Createanobject


Countrycountry1=myRealm.createObject(Country.class);




//Setitsfields


country1.setName(
"Norway"
);


country1.setPopulation(5165800);


country1.setCode(
"NO"
);




myRealm.commitTransaction();


你可能注意到了country1并不是用Country类的构造器创建的。对于一个Realm来说,管理一个RealmObject的实例,这个实例必须用createObject方法创建。

如果你必须使用构造器,别忘了在提交事务前使用相关Realm对象的copyToRealm方法。这里是示例:

1

2

3

4

5

6

7

8

9
//Createtheobject


Countrycountry2=
new
Country();


country2.setName(
"Russia"
);


country2.setPopulation(146430430);


country2.setCode(
"RU"
);




myRealm.beginTransaction();


CountrycopyOfCountry2=myRealm.copyToRealm(country2);


myRealm.commitTransaction();


注:copyToRealm方法还有一个很重要的作用就是可以把已经存在的对象直接拷贝进Realm数据库。


5.书写查询

Realm为创建查询提供了一套非常直观和流式的API。要创建一个查询,使用相关Realm对象的where方法并传入你感兴趣的对象的类。创建完查询之后,你可以使用返回一个RealmResults对象的findAll方法获取所有的结果,findAll。在下面的例子中,我们获取并打印Country的所有对象:

1

2

3

4

5

6

7

8
RealmResults<Country>results1=


myRealm.where(Country.class).findAll();




for
(Countryc:results1){


Log.d(
"results1"
,c.getName());


}




//PrintsNorway,Russia


Realm提供了几个命名非常贴切的方法,比如beginsWith,endsWith,lesserThan和greaterThan,可以用来过滤,筛选结果。下面的代码演示了如何使用greaterThan方法来获取population(人口)大于1亿的Countryobjects:

1

2

3

4

5

6
RealmResults<Country>results2=


myRealm.where(Country.class)


.greaterThan(
"population"
,100000000)


.findAll();




//GetsonlyRussia


如果你想查询结果被归类,你可以使用findAllSorted方法。在它的参数中,用一个String指定被归类field的名字,并用一个boolean指定归类顺序。

1

2

3

4

5

6
//Sortbyname,indescendingorder


RealmResults<Country>results3=


myRealm.where(Country.class)


.findAllSorted(
"name"
,
false
);




//GetsRussia,Norway



总结

在这篇快速入门中,你学到了如何在安卓项目中使用Realm。可以看到创建一个Realm数据库、存储查询数据是多么的容易。要学习更多tRealmforAndroid的知识,你可以查阅它的Java文档。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: