小东子的个人技术专栏

Android数据库新王者-Realm入门教程

好长时间没有写关于Android方面的学习文章了,今天给大家带来的是堪称是一个可以替代SQLite以及ORMlibraries的轻量级数据库—Realm移动端数据库。

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

Ream提供了五种编程方式的实现。分别是Java,Objective C,Swift,React-Native,tamarin。在这里我着重介绍在Android中的使用。后面也会介绍在Swift中得使用。

1.先介绍一下打开数据Realm数据库的工具:Realm Browser可视化工具

Realm资源包中包含了一个很有用的实用工具,可以帮助我们更好地管理Realm数据库,那就是Realm Browser。Realm Browser可以让您轻松地读写Realm数据库(以.realm结尾),因此我们无需头疼如何去查看Realm专有数据库的逻辑结构以及其中的数据,可视化的操作就如同SQLite的其他数据库查看工具一样,十分简单、易用(虽然Realm Browser的功能还十分简陋,真的只能读写而已)。

这里写图片描述

2.Realm支持的数据类型

  • 支持基本数据结构:boolean, byte, short, ìnt, long, float, double, String, Dateand byte[]
  • 支持JSON等复杂的数据类型

    3.Realm的官方名词

这里写图片描述

  • Realm:Realm是框架的核心所在,是我们构建数据库的访问点,使用建造者模式构建对象。
  • RealmObject:这是我们自定义的realm数据模型。创建数据模型的行为将会影响到数据库的结构。要创建一个数据模型,我们只需要继承RealmObject,然后设计我们想要存储的属性即可。
  • RealmQuery(查询):要在数据库中检索信息,我们需要用到“检索”操作。如果需要检索更复杂的数据,那么还可以使用复合查询以及结果排序等等操作。
  • RealmResults:这个类是执行任何查询请求后所返回的类,其中包含了一系列的Object对象。和List类似,我们可以用下标语法来对其进行访问,并且还可以决定它们之间的关系。不仅如此,它还拥有许多更强大的功能,包括排序、查找等等操作。

4、Realm在Android中的使用

4.1在项目的build.grade中配置下载库文件

在本案例中我使用的最新版本的1.0.0版本。

1
2
3
4
5
6
7
8
9
10
11
apply plugin: 'realm-android'
buildscript {
repositories {
jcenter()
maven { url 'https://jitpack.io' }
}
dependencies {
classpath "io.realm:realm-gradle-plugin:1.0.0"
}
}

4.2创建数据库,获取去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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.lidong.demo.realm;
import android.content.Context;
import io.realm.Realm;
import io.realm.RealmConfiguration;
/**
*
*@className:RealmUtil
*@desc:RealmUtil工具类
*@author:lidong
*@datetime:16/6/10 下午9:55
*/
public class RealmUtil {
private static RealmUtil sIntance;
public final Context mContext;
private String realmName = "realm_demo.realm";
public RealmUtil(Context mContext) {
this.mContext = mContext;
}
/**
* 双检索单例
* @param context
* @return
*/
public static RealmUtil getIntance(Context context){
if (sIntance == null) {
synchronized (RealmUtil.class) {
if (sIntance == null) {
sIntance = new RealmUtil(context);
}
}
}
return sIntance;
}
/**
* 获取realm对象
* @return
*/
public Realm getRealm(){
Realm realm =Realm.getInstancenew RealmConfiguration.Builder(mContext) .name(realmName) .build());
return realm;
}
}

4.3创建一个RealmObject

只要继承了RealmObject类,任意JavaBean都能存储在Realm中。必须有一个默认构造器,成员变量有相应的getter/setter方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.lidong.demo.realm;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
/**
* Person
*/
public class Person extends RealmObject {
@PrimaryKey
private String code;//编号
private String name;//姓名
private int age;//年龄
public Person() {
}
public Person(int age, String code, String name) {
this.age = age;
this.code = code;
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
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;
}
@Override
public String toString() {
return "Person{" +
"code='" + code + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}

4.4对数据Person进行增删改查操作

PersonDao.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.lidong.demo.realm;
import java.util.List;
/**
* Created by lidong on 16/6/9.
*/
public interface PersonDao {
/**
* 插入Person
* @param person
* @throws Exception
*/
void insert(Person person)throws Exception;
/**
* 获取所有的用户
* @return
* @throws Exception
*/
List<Person> getAllPerson()throws Exception;
/**
* 更新用户
* @throws Exception
*/
Person updatePerson(Person person)throws Exception;
/**
* 删除用户
* @param code
* @throws Exception
*/
void deletePerson(String code)throws Exception;
/**
* 异步插入Person
* @param person
* @throws Exception
*/
void insertPersonAsync(Person person)throws Exception;
}

PersonDaoImp.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package com.lidong.demo.realm;
import android.content.Context;
import java.util.List;
import io.realm.Realm;
/**
*
*@className:PersonDaoImpl
*@desc:
*@author:lidong
*@datetime:16/6/10 下午10:01
*/
public class PersonDaoImpl implements PersonDao {
private Context context;
private Realm mRealm;
public PersonDaoImpl(Context context){
mRealm = RealmUtil.getIntance(context).getRealm();
}
/**
* @同步插入用户
* @param person
* @throws Exception
*/
@Override
public void insert(Person person) throws Exception {
mRealm.beginTransaction();
Person person1 = mRealm.copyToRealm(person);
mRealm.commitTransaction();
mRealm.close();
}
/**
* 获取所有的用户
*
* @return
* @throws Exception
*/
@Override
public List<Person> getAllPerson() throws Exception {
List<Person> mlist = null;
mlist = mRealm.where(Person.class).findAll();
mRealm.close();
return mlist;
}
/**
* @param person
* @throws Exception
*/
@Override
public Person updatePerson(Person person) throws Exception {
mRealm.beginTransaction();
Person person1 = mRealm.copyToRealmOrUpdate(person);
mRealm.commitTransaction();
mRealm.close();
return person1;
}
@Override
public void deletePerson(String code) throws Exception {
Person person = mRealm.where(Person.class).equalTo("code",code).findFirst();
mRealm.beginTransaction();
person.deleteFromRealm();
mRealm.commitTransaction();
}
/**
* 异步插入Person
*
* @param person
* @throws Exception
*/
@Override
public void insertPersonAsync(final Person person) throws Exception {
//一个Realm只能在同一个线程中访问,在子线程中进行数据库操作必须重新获取Realm对象:
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.beginTransaction();
Person person1 = realm.copyToRealm(person);
realm.commitTransaction();
realm.close();//并且要记得在离开线程时要关闭 realm.close();
}
});
mRealm.close();//关闭Realm对象
}
}

4.5在Activity中简单调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.lidong.demo.realm;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.lidong.demo.R;
import java.util.List;
import io.realm.Realm;
public class DemoRealmActivity extends AppCompatActivity {
static final String TAG = DemoRealmActivity.class.getSimpleName();
Realm mRealm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo_realm);
// mRealm= RealmUtil.getIntance(this).getRealm();
//
//
// mRealm.executeTransaction(new Realm.Transaction() {
// @Override
// public void execute(Realm realm) {
// Person person = realm.createObject(Person.class);
// person.setName("李东");
// person.setAge(24);
// person.setCode(UUID.randomUUID().toString());
// }
// });
Person person = new Person();
person.setName("李东1");
person.setAge(28);
person.setCode("6e56d3aa-7119-429e-8c59-7ad8241e838d");
PersonDao dao = new PersonDaoImpl(this);
// try {
// dao.insert(person);
// } catch (Exception e) {
// e.printStackTrace();
// }
try {
dao.deletePerson("6e56d3aa-7119-429e-8c59-7ad8241e838d");
} catch (Exception e) {
e.printStackTrace();
}
try {
List<Person> persons = dao.getAllPerson();
Log.d(TAG, "onCreate: "+persons);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}

总结:Android中使用Realm数据库基本上就这几点步骤,这是个入门,更加复杂的操作,我在后面会慢慢的深入。

代码地址