Fork me on GitHub

Android之xUtils-3.0数据库框架详解

在Android 开发中,数据库模块是必不可少的.现在也有许多非常好用流行的数据库快速开发框架.今天主要介绍下xUtils下封装的数据库模块.

Android 常用数据库开发框架

在这里列一下Android开发中常用的数据库框架,有情趣的可以自行了解下,顺便储备点知识.

1.OrmLite
对象关系映射Lite(ORM Lite)提供了一些简单,轻量级的功能,用于将Java对象持久保存到SQL数据库,同时避免了更多标准ORM包的复杂性和开销。

2.LitePal
LitePal是一个开源的Android库,允许开发人员非常容易地使用SQLite数据库。您可以完成大部分数据库操作,而无需编写SQL语句,包括创建或升级表,crud操作,聚合函数等.LitePal的设置也非常简单,您可以在不到5分钟中将其集成到项目中。

3.GreenDao
greenDAO是一款轻巧快捷的Android版ORM,可将对象映射到SQLite数据库。greenDAO针对Android进行了高度优化,性能卓越,占用内存极少。

4.DBFlow
一个功能强大,功能强大且非常简单的ORM android数据库库,带有注释处理功能。
该库建立在速度,性能和可接近性的基础之上。它不仅消除了大多数用于处理数据库的样板代码,而且还提供了一个强大而简单的API来管理交互。

5.Realm
Realm是一个直接在手机,平板电脑或可穿戴设备中运行的移动数据库。此存储库包含Realm的Java版本的源代码,该版本目前仅在Android上运行。


xutils3.0数据库模块详解

项目加载

1.添加依赖
在app的build.gradle下添加以下依赖:

1
compile 'org.xutils:xutils:3.5.0'

对于gradle3.0以上,compile已经被废弃了,需要使用api
如下:

1
api 'org.xutils:xutils:3.5.0'

2.配置权限
在AndroidManifest中添加权限:

1
2
3
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

3.初始化
在application的onCreate中初始化:

1
2
3
4
5
6
7
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.
...
}

以上就是xutils3.0的使用配置了,配置好并且初始化好下面我们就可以愉快的使用了

xutils-DB使用

1.创建数据库帮助类:DatabaseOpenHelper

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

/**
* 数据库帮助类
* Created by darryrzhong on 2018/9/23.
*/

public class DatabaseOpenHelper {
private DbManager.DaoConfig daoConfig;
private static DbManager dbManager;
private final String DB_NAME="history.db";//数据库名
private final int VERSION = 1;


private DatabaseOpenHelper(){
//初始化数据库配置信息
daoConfig = new DbManager.DaoConfig()
.setDbName(DB_NAME)//设置数据库名称
.setDbVersion(VERSION)//设置初始版本号
.setDbOpenListener(new DbManager.DbOpenListener() {//监听数据库打开
@Override
public void onDbOpened(DbManager db) {
db.getDatabase().enableWriteAheadLogging();
//开启WAL, 对写入加速提升巨大(作者原话)
}
})
.setDbUpgradeListener(new DbManager.DbUpgradeListener() {//监听数据库更新
@Override
public void onUpgrade(DbManager db, int oldVersion, int newVersion) {

}
});
dbManager= x.getDb(daoConfig);//获取数据库管理类
}

//单例设计
public static DbManager getInstance(){
if (dbManager==null){
DatabaseOpenHelper databaseOpenHelper = new DatabaseOpenHelper();
}
return dbManager;
}
}

2.创建JavaBean数据实体类
先介绍下注解字段意思:

注意必须添加注解字段,否则数据库无法识别,且实体类必须要有无参构造,否则数据库可能创建不成功

1
2
3
@Table(name = "details") 表名

@Column(name = "userid") 字段名

实体类如下:

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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

/**
* 历史记录详情表
* Created by darryrzhong on 2018/7/23.
*/


@Table(name = "details")//表名即实体类名
public class HistoryDetails {
@Column(name = "id",isId = true,autoGen = true)//主键,自增
private int id;
@Column(name = "userid")
private String userid;
@Column(name = "photo")
private String photo;//视频封面
@Column(name = "title")
private String title;//视频标题
@Column( name = "detail")
private String detail;//视频分类and时长
@Column(name = "date")
private String date;//观看日期
@Column(name = "desc")
private String desc;//视频详情
@Column(name = "blurred")
private String blurred;//模糊图片
@Column(name = "video")
private String video;//视频播放地址
@Column(name = "collect")
private int collect;//收藏量
@Column(name = "share")
private int share;//分享量
@Column(name = "reply")
private int reply;//回复量

/**
* 无参数构造法不可私有化,否则数据库表格创建异常
* 若使用无参构造,容易引起数据插入只有一条。
*/
public HistoryDetails(){

}


/**
*
* @param photo 视频封面
* @param title 视频标题
* @param detail 视频分类And时间
*@param date 观看日期
* @param desc 视频详情
*@param blurred 迷糊图片
* @param video 视频播放地址
* @param collect 收藏量
* @param share 分享量
* @param reply 回复量
* */

public HistoryDetails(String photo, String title, String detail, String date, String desc, String blurred, String video, int collect, int share, int reply,String userid) {
this.photo = photo;
this.title = title;
this.detail = detail;
this.date = date;
this.desc = desc;
this.blurred = blurred;
this.video = video;
this.collect = collect;
this.share = share;
this.reply = reply;
this.userid = userid;
}

public String getPhoto() {
return photo;
}

public void setPhoto(String photo) {
this.photo = photo;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getDetail() {
return detail;
}

public void setDetail(String detail) {
this.detail = detail;
}

public String getDate() {
return date;
}

public void setDate(String date) {
this.date = date;
}

public String getDesc() {
return desc;
}

public void setDesc(String desc) {
this.desc = desc;
}

public String getBlurred() {
return blurred;
}

public void setBlurred(String blurred) {
this.blurred = blurred;
}

public String getVideo() {
return video;
}

public void setVideo(String video) {
this.video = video;
}

public int getCollect() {
return collect;
}

public void setCollect(int collect) {
this.collect = collect;
}

public int getShare() {
return share;
}

public void setShare(int share) {
this.share = share;
}

public int getReply() {
return reply;
}

public void setReply(int reply) {
this.reply = reply;
}

public String getUserid() {
return userid;
}

public void setUserid(String userid) {
this.userid = userid;
}
}

3.创建数据操作类

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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
public class HistoryDB {

private DbManager dbManager;
private boolean succeed;//操作是否成功
boolean idDesc = true;//是否倒序,默认false
private List<HistoryDetails> details =null;
private HistoryDetails historyDetails;
long count=0;

//初始化的DbManager对象
public HistoryDB(){
dbManager=DatabaseOpenHelper.getInstance();
}

/**
* 将HistoryDetails实例存进数据库
* 保存新增
* @param historyDetails
*
*/

public void saveHistory(HistoryDetails historyDetails){

try {
dbManager.save(historyDetails);
} catch (DbException e) {
e.printStackTrace();
}
}

/**
* 新增或更新
*
* @param historyDetails
*/

public void saveOrUpdate(HistoryDetails historyDetails){
try {
dbManager.saveOrUpdate(historyDetails);
// Log.e("log","save succeed!");
} catch (DbException e) {
e.printStackTrace();
}
}

/**
* 读取所有HistoryDetails信息
*
* @return
*/
public List<HistoryDetails> loadHistoryAll(){
try {
details=dbManager.selector(HistoryDetails.class).findAll();
} catch (DbException e) {
e.printStackTrace();
}
return details;
}

/**
* 根据视频标题读取HistoryDetails信息
*
* @return
*/

public List<HistoryDetails> loadHistoryByTitle(String title){
try {
details=dbManager.selector(HistoryDetails.class).where("title","==",title).findAll();
} catch (DbException e) {
e.printStackTrace();
}
return details;
}

/**
* 根据用户id读取HistoryDetails信息
*
* @return
*/

public List<HistoryDetails> loadHistoryByUserId(String userid){
try {
details=dbManager.selector(HistoryDetails.class).where("userid","==",userid).findAll();
} catch (DbException e) {
e.printStackTrace();
}
return details;
}




/**
* 删除对象数据
*
*
* @return
*/
public boolean delete(HistoryDetails historyDetails){
try {
dbManager.delete(historyDetails);
succeed=true;
} catch (DbException e) {
succeed=false;
e.printStackTrace();
}
return succeed;
}


/**
* 删除表
*
* @throws DbException
*/

private void delTable() throws DbException{
dbManager.dropTable(HistoryDetails.class);

}

//关闭数据库
public void close(){
try {
dbManager.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

4.使用数据库

创建以上操作类,就可以愉快的快速使用数据库了.

值得注意的是,xutils3并没有提供单独创建一张表的方法,他是在你调插入数据库操作的时候会判断是否存在这张表,如果不存在就会去创建,所以我们在取数据的时候需要判断表是否存在

1
2
3
4
5
6
7
db = new HistoryDB();
details= db.loadHistoryByUserId(sharedPreferences.getString("userId","000"));
if (details==null||details.size()==0){//如果表为空的话则为null,
tvHint.setVisibility(View.VISIBLE);
compile.setVisibility(View.GONE);
cleanHint.setVisibility(View.GONE);
}

还有一点值得注意就是,xutils插入数据库时,相同数据是会重复插入的,
所以我们可以按自身需求去解决,例如我这里保存视频观看记录不需要重复插入数据.
所以我根据id判断数据是否存在,不存在则插入数据库保存:

1
2
3
4
5
6
List<HistoryDetails> temp = hdb.loadHistoryByTitle(title);//同步默认账户观看记录
if (temp==null){
hdb.saveOrUpdate(historyDetails);//判断表是否存在
}else if (temp.size()==0){
hdb.saveOrUpdate(historyDetails);//判断数据是否存在
}

xutils使用就这么简单的完成了数据库的编写,使用起来步骤简单明了,当然还有很多缺憾,所以数据库模块比较繁重的话还是推荐以上介绍的几种开发框架.

欢迎关注作者darryrzhong,更多干货等你来拿哟.

请赏个小红心!因为你的鼓励是我写作的最大动力!

更多精彩文章请关注

-------------本文结束 感谢阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!