写在前面
Realm数据库不同于SQLite,两者可以说是同级的,为什么选择Realm数据库?Android目前流行三方数据库ORM分析及对比。我个人觉得最主要的是两点:1. 访问快,直接操作底层数据;2. 支持跨平台。什么是ORM? object relation model,对象关系映射模型,就是通过使用描述对象和数据库之间映射的元数据,来实现面向对象语言程序中的对象与关系数据库中数据的映射。简单来说,就是一个类对应数据库中的表,一个属性对应数据库中的一列,一个类的对象对应数据库中的一条记录。 参考。基于ORM技术的框架称为ORM框架,它使得使用者更容易理解和操作数据库,但是由于中间需要转换,所以性能上比直接使用SQL语句要慢,另外还需要保存数据对应的类,所以需要更多的内存。
简单使用
几个概念
1. 数据模型
- 一个模型(java中的一个类)表示数据库中的一张表,模型中的字段表示表中的列
- 模型需要继承
RealmObjec
t类 - 模型实时、自动更新(需要获得当前线程的looper,在主线程中是满足的);操作模型就相当于直接操作数据库中底层数据
2. 事务
- 所有会使数据发生变化 的操作必须在事务中进行。如:增、删、改
- 事务分为同步事务和异步事务两种
3. 引用计数
- Realm实例使用引用计数的方式
- 生成的Realm实例在使用完后需要手动close。
4. 数据库的迁移
在Realm中如果增加、删除了模型或者模型的字段,需要进行数据库的迁移。这个概念类似于数据库的升级。
添加配置文件
- 在project的
build.gradle
文件中调加依赖
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:5.12.0"
}
}
- 在app下的
build.gradle
文件顶部添加对应的插件支持
apply plugin: 'realm-android'
初始化Realm并配置Realm
1. 在application的onCreate()
中使用Realm.init()
初始化
2. 在application的onCreate()
中对Realm进行相关的配置
配置不是必须的,如果不配置,会使用默认配置;但是如果有数据库的迁移,那么是需要配置数据库的。
- 使用默认配置
有两种方式可以使用默认配置:
//方式1:
// Get a Realm instance for this thread
Realm realm = Realm.getDefaultInstance();
这样得到的Realm实例使用的就是默认的配置。
//方式二
RealmConfiguration config = new RealmConfiguration.Builder().build();
Realm.setDefaultConfiguration(conf);
默认配置的话,会得到一个名为default.realm
数据库,数据库保存地址:data/data/包名/files/default.realm
。
- 自定义配置
// The Realm file will be located in Context.getFilesDir() with name "myrealm.realm"
RealmConfiguration config = new RealmConfiguration.Builder()
.name("myrealm.realm")
.encryptionKey(getKey()) //设置密钥
.schemaVersion(42) //版本号
.modules(new MySchemaModule())
.migration(new MyMigration()) //数据库迁移
.build();
// Use the config
Realm realm = Realm.getInstance(config);
3. Realm使用完了之后要关闭
一般在activity.onDestroy()
中关闭,或者在finally语句块中关闭
try {
// ... Use the Realm instance ...
} finally {
realm.close();
}
创建模型
一般来说都是写一个类继承RealmObject
public class User extends RealmObject {
private String name;
private int age;
@Ignore
private int sessionId;
// Standard getters & setters generated by your IDE…
public String getName() {
return name; }
public void setName(String name) {
this.name = name; }
public int getAge() {
return age; }
public void setAge(int age) {
this.age = age; }
public int getSessionId() {
return sessionId; }
public void setSessionId(int sessionId) {
this.sessionId = sessionId