这章讲的是框架的DbUtils模块的学习

三 xUtils框架的DButils模块

  最开始接触这个框架就是从数据库模块开始的。当时的需求是需要记录用户的登录数据,保存在本地以便进行离线登录。首先想到的是用sharedpreference存储,但是后面说要支持多用户同设备登录,所以就想到了数据库保存信息。于是就用到了dbutils,当时由于项目比较紧就没过多研究,用了比较简洁的方法,在开始的时候用sqlite的可视化数据库操作工具创建了数据库直接放到asset文件夹下面的。至于如何在项目中直接创建数据库,后面部分会陆续提到。

  3.1 用sqlite expert profession3 软件创建数据库

  首先声明一下sqlite的数据存储类型和MySQL以及其他数据库的数据存储类型不一样,主要有null(空值)、INTERGER(有符号整数类型)、REAL(浮点数类型)、TEXT(字符串)、BLOB(二进制表示)。用sqliteExpert 创建表 user_info ,并在表里面增加column,把ID作为primaryKey,并设置为自增长。仔添加其他字段,数据库表创建完成后将数据库拷贝到工程的asset文件夹下。

sqliteExpert工具的使用会在另外一篇文章里面讲解。详情见sqliteE软件使用(创建数据库和表) 

3.2  在工程 下创建service 包,并在该包下创建DBService.class文件用来进行数据库的初始化。下面是DBService的代码。

 
public class DbService {
private Context context;
private static DbService instance;
/***
* userInfoDbUtils:人员登录数据库(将用户登录信息保存在本地数据库)
*/
private DbUtils userInfoUtils;
public DbUtils getDbUtils() {
if (dbUtils == null) {
openBaseDb();
}
return dbUtils;
}
private DbService(Context context) {
this.context = context;
}
public static DbService getInstance(Context context) {
if (instance == null) {
instance = new DbService(context);
}
return instance;
}
/**
* @Method :初始化打开数据库
*/
public void initAllDbs() { openUserInfoDB();
}
private void openUserInfoDB(){
userInfoUtils = DbUtils.create(context,
Constants.getLocalDefaultPath(),
Constants.USER_INFO);
userInfoUtils.configAllowTransaction(true);
userInfoUtils.configDebug(true);
}
/**
* @Method :关闭所有数据库
*/
public void closeAllDbs() {
if(null != userInfoUtils){
userInfoUtils.close();
}
}
public DbUtils getUserInfoUtils() {
if(null == userInfoUtils){
openUserInfoDB();
}
return userInfoUtils;
}
}
 

  3.3 在工程下创建entity包 ,并在该包内创建UserEntity.class文件,与表的字段对应,下面是UserEntity的代码,可以看到表里的每一个字段都有
一个属性与之对应。这样在用到DbUtils的时候才能将数据准确的与对象属性对应。这个对象类与普通的对象类不同的是就是在前面加了xutils框架里面的数据库的表注解@Table以及字段的注解@Column。

 
@Table(name = "user_info")
public class UserInfo {
/***
* id
*/
@Column(column = "id")
private int id;
/***
* 用户名
*/
@Column(column = "USER_NAME")
private String username;
/***
* 密码
*/
@Column(column = "PASSWORD")
private String password; /***
* 查询范围(用json字串存起来,在读取的时候再进行对象转换)
*/
@Column(column = "MODULE_QUERY")
private String muduleList; public String getMuduleList() {
return muduleList;
}
public void setMuduleList(String muduleList) {
this.muduleList = muduleList;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
 

  3.4 在工程开始启动的时候就创建数据库,项目中是在启动的时候有一个开始动画,所以就在这个动画的页面里面进行了数据库的初始化。具体代码如下
  

 
private static final String[] FILE_NAME_ASSETS = { "USER_INFO.db"};//由于考虑到会有其他的数据库要进行加载,所以就用一个字节数组保存
private class SplashRunnable implements Runnable {
@Override
public void run() {
String sdCardStatus =Environment.getExternalStorageState();
if (sdCardStatus.equals(Environment.MEDIA_MOUNTED)) {
FileUtils.makeDirs(Constants.getLocalDefaultPath());
for (String fileName : FILE_NAME_ASSETS) {
if (!FileUtils.isFileExist(Constants.getLocalDefaultPath()
.concat("/").concat(fileName))) {
appService.copyApkFromAssets(mContext,fileName,
Constants.getLocalDefaultPath().concat("/")
.concat(fileName));
}
}
startActivity(loginIntent);
finish();
}
}
}
 

  在这里我起了一个线程去做这件事情,这个线程做的事情是先检测是否存在SD卡,如果存在就检测数据库文件是否存在,不存在的话就将数据库拷贝到指定的文件夹下面。然后再跳转到下一个页面。这就完成了数据库的初始化。注:appService是我在项目里面创建的一个服务类。
  下面是拷贝的方法

 
public boolean copyApkFromAssets(Context context, String fileName,
String path) {
boolean copyIsFinish = false;
InputStream is = null;
FileOutputStream fos = null;
try {
is = context.getAssets().open(fileName);
File file = new File(path);
if (file.exists()) {
file.delete();
}
file.createNewFile();
fos = new FileOutputStream(file);
byte[] temp = new byte[1024];
int i = 0;
while ((i = is.read(temp)) > 0) {
fos.write(temp, 0, i);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
copyIsFinish = true;
}
return copyIsFinish;
}
 

  3.5 接下来是在项目里面使用数据库里面的数据。
  首先创建一个LoginService类来操作数据库,比如数据的存储,数据的保存,删除。我在这个类里面只用到了数据的读取和保存。

 
public class LoginService {
private DbUtils dbUtils;
private static LoginService loginService;
private Context mContext;
private LoginService(Context context){
this.mContext = context;
dbUtils = DbService.getInstance(context).getUserInfoUtils();
}
public static LoginService getInstance(Context context){
if(null == loginService)
loginService = new LoginService(context);
return loginService;
}
//根据用户名得到用户的信息
public UserInfo getUserInfoByUserName(String userName){
try{
UserInfo userInfo = dbUtils.findFirst(Selector.from(UserInfo.class).where("USER_NAME","=",userName));
if(null != userInfo){
return userInfo;
}
}catch (DbException e){
e.printStackTrace();
}
return null;
}
//保存用户信息
public void saveUserInfo(UserInfo userInfo){
try {
dbUtils.save(userInfo);
}catch (DbException e){
e.printStackTrace();
}
}
}
 

然后就是使用了

 
UserInfo userInfo = new UserInfo();
userInfo.setUsername(userName);
userInfo.setPassword(password);
//先检查数据库是否已经保存用户数据,如果没有再去进行数据插入
UserInfo pUserInfo = LoginService.getInstance(mContext).getUserInfoByUserName(userName);
if(null == pUserInfo){
LoginService.getInstance(mContext).saveUserInfo(userInfo);
}
 

至此,DbUtils模块的使用就完成了,虽然有点繁琐,但是只要按照要求一步步去写完的话,后面的实现和使用还是很简单的。

至于数据库的更新以及创建,后续会陆陆续续的补上的。

xUTils框架的学习(二)的更多相关文章

  1. (转)MyBatis框架的学习(二)——MyBatis架构与入门

    http://blog.csdn.net/yerenyuan_pku/article/details/71699515 MyBatis框架的架构 MyBatis框架的架构如下图: 下面作简要概述: S ...

  2. XUtils框架的学习(一)

    一  xutils框架引入到AndroidStudio工程,最简单的方法:① 在APP的build.gradle里面加入 compile 'org.xutils:xutils:3.3.36'.② 一定 ...

  3. XUTils框架的学习(三)

    前面两章说了xutils框架的引入和注解模块的使用和数据库模块的使用,想了解的朋友可以去看看. 前面在说数据库模块的操作的时候是手动创建数据库并保存在asset文件夹里面,再通过I/O将数据库写进应用 ...

  4. (转)MyBatis框架的学习(三)——Dao层开发方法

    http://blog.csdn.net/yerenyuan_pku/article/details/71700957 使用MyBatis开发Dao层,通常有两个方法,即原始Dao开发方法和Mappe ...

  5. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  6. Reactive UI -- 反应式编程UI框架入门学习(二)

    前文Reactive UI -- 反应式编程UI框架入门学习(一)  介绍了反应式编程的概念和跨平台ReactiveUI框架的简单应用. 本文通过一个简单的小应用更进一步学习ReactiveUI框架的 ...

  7. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  8. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  9. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

随机推荐

  1. MySQL 5.1.63 单机配置多实例(简单配置)

    需求: 在一台服务器上通过源码编译安装一个版本为5.1.63版本MySQL数据库: 方案:将所有配置文件与数据等均存放在/home/zhaoshuangshuang下.在同一个MySQL中运行两个实例 ...

  2. 六、mysql字段类型选择

    .char类型字段会自动删除字符串后面所带的空格,而varchar不会 .char比varchar快..... .myisam 建议 char类型,memory char跟varchar一样,都作为c ...

  3. IOS 学习参考

    IOS 开发 http://code4app.com/ios/%E5%AE%9E%E6%97%B6%E6%9B%B4%E6%96%B0%E7%9A%84%E6%9B%B2%E7%BA%BF%E5%9B ...

  4. C# - 高级方法参数

    可选参数 -必须有个默认值,默认值必须是字面值,常量值,新对象实例或者默认值类型值. public List<string> GetWords( string sentence, bool ...

  5. dictionary 和 hashtable 区别

    区别:1,Dictionary支持泛型,而Hashtable不支持. 2,Dictionary没有装填因子(Load Facto)概念,当容量不够时才扩容(扩容跟Hashtable一样,也是两倍于当前 ...

  6. MySQL 主主同步配置和主从配置步骤

    ★预备知识 : 1.双机热备 对于双机热备这一概念,我搜索了很多资料,最后,还是按照大多数资料所讲分成广义与狭义两种意义来说. 从广义上讲,就是对于重要的服务,使用两台服务器,互相备份,共同执行同一服 ...

  7. 利用钩子函数来捕捉键盘响应的windows应用程序

    一:引言: 你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到 ...

  8. spoj 346

    当一个数大于等于12  那分别处以2, 3, 4之后的和一定大于本身    但是直接递归会超时    然后发现有人用map存了   膜拜..... #include <cstdio> #i ...

  9. Avro RPC 之 Protocol 定义和代码生成

    摘自http://avro.apache.org/docs/current/spec.html#Protocol+Declaration,1.7.6版 Protocol Declaration Avr ...

  10. POJ2187Beauty Contest

    http://poj.org/problem?id=2187 题意 :有一个农场有N个房子,问最远的房子相距多少距离 . 思路 :凸包,旋转卡壳,通过寻找所有的对锺点,找出最远的点对. #includ ...