Realm for Android快速入门教程
介绍
如果你关注安卓开发的最新趋势,你可能已经听说过Realm。Realm是一个可以替代SQLite以及ORMlibraries的轻量级数据库。
相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,以及加密支持,这些都为安卓开发者带来了方便。
在这篇快速入门教程中,你将学到Android版Realm的基础知识。本教程我们使用的是Realm v0.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
|
Realm myRealm = Realm.getInstance(context); |
注意,调用Realm.getInstance,而没有传入RealmConfiguration,会创建一个叫做 default.realm的Realm文件。
如果你想向app中添加另一个Realm,必须使用一个RealmConfiguration.Builder对象,并为Realm 文件指定一个独有的名字。
|
1
2
3
4
5
6
|
Realm myOtherRealm = 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
|
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; } } |
如果你想让RealmObject的一个成员变量作为主键,你可以使用@PrimaryKey注解。比如,这里演示了如何为Country类添加一个主键code:
|
1
2
3
4
5
6
7
8
9
10
|
@PrimaryKeyprivate String code; public String getCode() { return code;} public void setCode(String code) { 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(); // 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类的构造器创建的。对于一个Realm来说,管理一个RealmObject的实例,这个实例必须用createObject方法创建。
如果你必须使用构造器,别忘了在提交事务前使用相关Realm对象的copyToRealm方法。这里是示例:
|
1
2
3
4
5
6
7
8
9
|
// Create the objectCountry country2 = new Country();country2.setName("Russia");country2.setPopulation(146430430);country2.setCode("RU"); myRealm.beginTransaction(); Country copyOfCountry2 = myRealm.copyToRealm(country2);myRealm.commitTransaction(); |
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(Country c:results1) { Log.d("results1", c.getName());} // Prints Norway, 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(); // Gets only Russia |
如果你想查询结果被归类,你可以使用findAllSorted方法。在它的参数中,用一个String指定被归类field的名字,并用一个boolean指定归类顺序。
|
1
2
3
4
5
6
|
// Sort by name, in descending orderRealmResults<Country> results3 = myRealm.where(Country.class) .findAllSorted("name", false); // Gets Russia, Norway |
总结
在这篇快速入门中,你学到了如何在安卓项目中使用Realm。可以看到创建一个Realm数据库、存储查询数据是多么的容易。要学习更多t Realm for Android的知识,你可以查阅它的 Java 文档。
Realm for Android快速入门教程的更多相关文章
- Hello, Android 快速入门
Hello, Android Android 开发与 Xamarin 简介 在这两节指南中,我们将 (使用 Xamarin Studio或 Visual Studio)建立我们的第一个 Xamarin ...
- 《Delphi XE6 android 编程入门教程》推荐
近5.6年已经没有看见关于delphi的新技术的书出来了(看来在国内delphi的使用量确实很低了), 高勇同学最近出了一本<Delphi XE6 android 编程入门教程>,上周刚拿 ...
- 专为设计师而写的GitHub快速入门教程
专为设计师而写的GitHub快速入门教程 来源: 伯乐在线 作者:Kevin Li 原文出处: Kevin Li 在互联网行业工作的想必都多多少少听说过GitHub的大名,除了是最大的开源项目 ...
- EntityFramework6 快速入门教程
EntityFramework6 快速入门教程 不得不说EF在国内实在是太小众,相关的技术文章真实屈指可数,而且很多文章都很旧了,里面使用的版本跟如今的EF6差别还是比较大.我刚开始弄这个的时候真是绕 ...
- Apple Watch开发快速入门教程
Apple Watch开发快速入门教程 试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...
- 指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程
指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程 1.4.2 指示灯组 指示灯组的放大图如图1.5所示. 图1.5 指示灯组 各个指示灯对应的功能如下: q RX:对应于0号端口, ...
- 游戏控制杆OUYA游戏开发快速入门教程
游戏控制杆OUYA游戏开发快速入门教程 1.2.2 游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4 游戏控制杆各个角度的 ...
- Query 快速入门教程
Query 快速入门教程 http://www.365mini.com/page/jquery-quickstart.htm#what_is_jquery jquery常用方法及使用示例汇总 http ...
- CMake快速入门教程-实战
http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/ http://blog.csdn.net/dbzhang800/article/detai ...
随机推荐
- 20160408javaweb之JDBC ---PreparedStatement
PreparedStatement 1.Sql注入:由于jdbc程序在执行的过程中sql语句在拼装时使用了由页面传入参数,如果用户恶意传入一些sql中的特殊关键字,会导致sql语句意义发生变化,这种攻 ...
- java.lang.NoClassDefFoundError的原因及解决
[O] 安卓应用在低版本(V2.3.6)系统上运行时报错: java.lang.NoClassDefFoundError 完整错误信息如下: 05-29 13:56:13.687: E/Android ...
- 冒泡排序算法(C#实现)
简单的冒泡排序算法,代码如下: ] = temp; hasExchangeAction =true; //发生过互换 } } if (!hasExchangeAction) //如果没有发生过互换,则 ...
- ZeroMemory
ZeroMemory: 用0填充一个内存块 void ZeroMemory( [in] PVOID Destination, //内存块开始地址 [in] SIZE_T Length //填充块大小 ...
- Google Maps API 调用实例
本实例介绍如何调用Google Maps API,并实现用鼠标标注地图,保存进数据库,以及二次加载显示等. 1.需要新建一个自定义控件(如:Map.ascx),用于显示Google地图: <%@ ...
- DailyNote
删除node-modules文件夹 npm install -g rimraf rimraf node_modules 绘制一条贝塞尔曲线: context.quadraticCurveTo(x1,y ...
- ASP.NET中的特殊路径标识"~"
/ 表示网站根目录(从域名开始), ../ 表示上级目录, ./表示当前目录- 是ASP.NET定义的特殊符号,是ASP.NET内部进行定义推荐的用法,-代表从应用根目录开始定义应用根目录与网站根目录 ...
- scala - 从合并两个Map说开去 - foldLeft 和 foldRight 还有模式匹配
开发中遇到需求:合并两个Map集合对象(将两个对应KEY的值累加) 先说解决方案: ( map1 )) ) } 这特么什么鬼 (╯‵□′)╯""┻━┻☆))>○<) ...
- ECMAScript一元操作符
在ECMAScript中提供了一元操作符进行简单的运算,一元操作符是ECMAScript中最简单的操作符,它只能对一个值进行操作. 一元操作符有两种类型,一种是递增和递减操作符,一种是一元加和一元减操 ...
- Linq知识大全
select的源码public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable< ...