Android开发中常用的数据库有5个:
GreenDAO小于100KB,所以对于应用程序APK的大小影响很小。
相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,以及加密支持,这些都为安卓开发者带来了方便。
Ream提供了五种编程方式的实现。分别是Java,Objective C,Swift,React-Native,tamarin。在这里我着重介绍在Android中的使用。
大家可以直接看官方的文档,我也是在这基础的上讲解:realm使用
快速入门:
第一步:在项目的 build.gradle 文件中添加如下 class path 依赖。
1
2
3
4
5
6
7
8
|
repositories {
jcenter()
}
dependencies {
classpath
"io.realm:realm-gradle-plugin:1.0.0"
}
}
|
第二步:在 app 的 build.gradle 文件中应用
realm-android插件。
1
|
|
如果读者使用的是maven构建项目,官方也有说明,这里我就不列出来了。
说到这里,我们已经迫不及待的想尝试下了。
1,application里面初始化
1
2
3
4
5
6
7
8
9
10
11
12
|
@Override
public
void
onCreate() {
super
.onCreate();
init();
}
private
void
init() {
RealmConfiguration realmConfiguration =
new
RealmConfiguration.Builder(
this
).build();
Realm.setDefaultConfiguration(realmConfiguration);
}
}
|
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
|
private
static
RealmUtils instance;
public
final
Context mContext;
private
String realmName =
"realm_demo.realm"
;
public
RealmUtils(Context mContext) {
this
.mContext = mContext;
}
public
static
RealmUtils getInstance(Context context){
if
(instance ==
null
) {
synchronized
(RealmUtils.
class
) {
if
(instance ==
null
) {
instance =
new
RealmUtils(context);
}
}
}
return
instance;
}
public
Realm getRealm(){
Realm realm =Realm.getInstance(
new
RealmConfiguration.Builder(mContext).name(realmName).build());
return
realm;
}
}
|
3,创建一个realmObject对象,存储object
例如,我们现在需要存储一个人(Person)对象,注意,这里的成员属性为了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
|
@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,定义几个CRUD的方法,供其它类实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//插入
void
insert(Person person)
throws
Exception;
//查询
List
throws
Exception;
//更新
Person updatePerson(Person person)
throws
Exception;
//删除
void
deletePerson(String code)
throws
Exception;
// 异步插入
void
insertPersonAsync(Person person)
throws
Exception;
}
|
5,对象的具体实现
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
|
private
Context context;
private
Realm mRealm;
public
PersonDaoImpl(Context context){
mRealm = RealmUtils.getInstance(context).getRealm();
}
@Override
public
void
insert(Person person)
throws
Exception {
mRealm.beginTransaction();
Person person1 = mRealm.copyToRealm(person);
mRealm.commitTransaction();
mRealm.close();
}
@Override
public
List
throws
Exception {
List
null
;
mlist = mRealm.where(Person.
class
).findAll();
mRealm.close();
return
mlist;
}
@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();
}
@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();
}
});
//关闭Realm对象
mRealm.close();
}
}
|
6,测试
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
|
private
Realm mRealm;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private
void
init() {
Person person =
new
Person();
person.setName(
"测试"
);
person.setAge(
28
);
person.setCode(
"xxxx"
);
PersonDao dao =
new
PersonDaoImpl(
this
);
try
{
//增加
dao.insert(person);
//查询全部
dao.getAllPerson();
//指定code删除
dao.deletePerson(
"xxxx"
);
//更新
dao.updatePerson(person);
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
|
其实这和以前的用法差不多的,有点在于,realm去帮我们管理这个数据库,并且在安全上我这还没有讲到,这里只讲了基本用法,大家可以去看看官方的文档说明:
官方文档