Realm简单上手

2015-05-21

前言

前段时间研究的开源项目,目前也有一些知名客户端在使用,比如我们熟知的pinterest,这样一个客户端也选择Realm着实说明这个项目的优越性,同时在学习的过程中我也发现了它的一些暂时性的缺陷,但是Realm项目组一直在迭代这个产品。

crosswall

简介

Realm是在Y Combinator孵化的创业团队打造的跨平台的移动设备数据库。可运行于手机、平板和可穿戴设备之上。可以让你的应用更快速,带来难以想象的体验。其目标是为了代替 CoreData 和 SQLite 数据库。目前支持 iOS/OS X/Android 平台,提供 Swift/Objective-C/Java 语言的 API。

使用前须知

  • Realm查询真的很快,飞起来的感觉
  • 想要表就必须继承RealmObject
  • Realm目前有很多缺点,比如:不支持序列化
  • Realm使用的是linQ语法
  • 这是一个前沿产品,一旦使用可能会导致与新版本不兼容

创建数据库

1.默认数据库

创建一个默认数据库过程很简单,默认数据库名为default.realm,默认的位置是context.getFilesDir(),使用方法如下:

1
Realm mRealm = Realm.getInstance(context);
2.自定义filename
1
Realm mRealm = Realm.getInstance(context,filename);
3.给数据库加密
1
2
byte[] key = new byte[64];
Realm mRealm = Realm.getInstance(context,filename,key);
4.自定义filefolder

目前的版本貌似很卡,所以不推荐使用,一直在观望Realm团队改进

1
2
3
4
5
6
/**
* @param File fileFolder
* @param String databaseName
* @param byte[] key
*/
Realm mRealm = Realm.getInstance(writeableFolder,filename,key);

创建表

Realm的数据表创建很简单,只需要继承RealmObject,实现Getter&Setter就可以了,诠释什么是简单粗暴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Sample extends RealmObject {
@PrimaryKey
private String id;
private String name;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

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

插入

Realm支持的插入数据可以是一个对象,也可以是json字符串,非常的方便

1
2
3
4
5
6
7
8
9
//插入一个对象
realm.beginTransaction
realm.copyToRealm(sample);
realm.commitTransaction;

//插入json字符串
realm.beginTransaction
realm.createObjectFromJson(sample.toJsonString())
realm.commitTransaction;

查询

Relam支持丰富的查询条件,支持one-to-many、many-to-many
官方文档和API中都有相关说明

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* return RealmObject
*/
realm.where(Sample.clss).findFirst();

realm.where(Sample.class).equalTo("id","xxxxxx").findFirst();//String fieldName

/**
* return RealmResult
*/
realm.where(Sample.class).findAll();

realm.where(Sample.class).findAllSorted("id",true); //String fieldName, boolean sortAscending