Realm使用详解
听首歌先
Nod To It
本来是说是一周一更新的,但是最近确实事情太多了。
写这些文章主要是对自己平时的工作学习做一个记录,也让自己温故知新。
话不多说,正文开始:
数据库Realm,是用来替代sqlite的一种解决方案,它有一套自己的数据库存储引擎,比sqlite更轻量级,拥有更快的速度,并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,自动数据同步,简单身份验证,访问控制,事件处理,最重要的是跨平台,目前已有Java,Objective C,Swift,React-Native,Xamarin这五种实现。
集成到Android Studio
- Add the class path dependency to the project level build.gradle file.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:3.0.0"
}
}
- Apply the realm-android plugin to the top of the application level build.gradle file.
apply plugin: 'realm-android'
基本使用
- Realm model classes are created by extending the RealmObject base class.
意思说我们的实体类需要继承RealmObject ,并指定一个PrimaryKey.
PrimaryKey必须唯一。
- Field types
其中支持的数据类型有:boolean、short、int、long、float、double、byte[]、String、data、Any RealmObject subclass、RealmList.
RealmList像是Java的List,是一个容器,我们可以利用它来构建一对多的关系。
- Annotations
- @PrimaryKey设置主键,主键必须唯一。我们使用了主键后,可以通过copyToRealmOrUpdate()方法去查询对象,如果查询到了则更新,否则新建一个对象来代替。但是有个弊端:使用主键注解后,创建和更新数据会慢一点,查询会快一点。
- @Required是强制某个字段数据不能为null
- @lgnore 忽略,即该字段不会被存储到本地
- @Index,为使用此注解的字段添加一个搜索引擎。插入数据的时候会变慢,查询的速度会变快,适用于优化读取性能的应用场景。
-
增删改查的事务操作
- 初始化Realm
有两种方式来初始化Realm
//默认初始化
mRealm = Realm.getDefaultInstance();
//自定义配置
RealmConfiguration configuration = new RealmConfiguration.Builder()
.inMemory() //数据存在内存中,不写入硬盘,随着应用退出所存数据会被删除
.schemaVersion(1) //设置数据库的版本号
.rxFactory(new RealmObservableFactory()) //支持RxJava
.name("Leo") //数据库名字
.deleteRealmIfMigrationNeeded()
.build();
mRealm = Realm.getInstance(configuration);- 插入
public void addPerson(final Person person) { mRealm.beginTransaction(); mRealm.copyToRealm(person); mRealm.commitTransaction(); }
- 删除
public void deletePerson(String id)
{
Person person = mRealm.where(Person.class).equalTo("id", id).findFirst();
mRealm.beginTransaction();
person.deleteFromRealm();
mRealm.commitTransaction();
}
- 修改
public void updatePerson(String id, String newName)
{
Person person = mRealm.where(Person.class).equalTo("id", id).findFirst();
mRealm.beginTransaction();
person.setName(newName);
mRealm.commitTransaction();
}
- 查询
(1). 查询所有
```
public List<Person> queryAllPerson()
{
RealmResults<Person> persons = mRealm.where(Person.class).findAll();
/**
* 对查询结果,按Id进行排序,只能对查询结果进行排序
*/
//增序排列
persons = persons.sort("id");
// //降序排列
// persons=persons.sort("id", Sort.DESCENDING);
return mRealm.copyFromRealm(persons);
}
```
(2).通过某一个属性查询
```
public Person queryPersonById(String id)
{
Person person = mRealm.where(Person.class).equalTo("id", id).findFirst();
return person;
}
```
(3).模糊查询
```
public List<Person> queryContains()
{
RealmResults<Person> persons = mRealm
.where(Person.class)
.contains("name", "J")
.findAll();
return persons;
}
```
(4).范围查询
public List<Person> queryBetween()
{
RealmResults<Person> age = mRealm
.where(Person.class)
.between("age", 10, 20)
.findAll();
return age;
}
(5).分组查询
public List<Person> queryGroup()
{
RealmResults<Person> r = mRealm.where(Person.class)
.greaterThan("age", 10) // implicit AND
.beginGroup()
.equalTo("name", "Jack")
.or()
.contains("name", "Leo")
.endGroup()
.findAll();
return r;
}
> 异步事务操作的话,可以去看看官方的文档,写的也很详细。示例[RealmDemo](https://github.com/LeXiaoWen/RealmDemo)已上传至github.