Android中自带的数据库有Sqlite,但是平时开发时候如果我们需求的表结构很复杂,这样一些业务逻辑和版本升级使用Sqlite是不太方便的,通常我们会自己封装一个框架或者用一些开源的框架来对数据库进行操作,今天我就介绍一款轻量级的数据库LitePal,如果你对Sqlite感兴趣,可以去这里下载jar包和源码。文章出自http://blog.csdn.net/guolin_blog/article/details/38083103,Thank You!下面开始我们今天的讲述。
一、sql命令简单使用
为了方便我们一会儿查看到信息,可用现在通讯录中添加一条记录。
①. 打开命令行窗口,显示当前可用设备: adb devices
②. 进入shell模式:adb shell (注:请使用已Root手机或者模拟器,如果多个设备连接请用adb -s 设备名称 shell ,#代表有Root权限)
③.接着进入指定目录:cd data/data/com.android.providers.contacts/databases
④.查看当前目录下内容:ll
⑤.打开数据库:sqlite3 contacts2.db
⑥.查看表:.table
⑦.进入line 模式:.mode line(可用对表结构的显示起到格式化作用)
⑧.显示表结构:pragma table_info(accounts); ( pragma table_info(表名) )
⑨.查看表中数据:select * from data; (基本的sql语句,用于查看data表中的数据 )
sql命令简单使用就介绍完了最后我们会看到之前我们在通讯录中添加的那条数据。
二、LitePal的基本用法
LitePal介绍:LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发时最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表、増删改查的操作。并且LitePal很“轻”,jar包只有100k不到,下面我们通过一个简单的Demo来了解LitePal。
①.打开Android Studio 新建Module(或者用ADT新建一个Android Project)项目目录结构如下。
②.我们之前说过LitePal是基于对象关系映射的,也就是用面向对象的思想,将对象自动映射到表关系中。首先我们在domain包中新建一个Person类
public class Person {
//id字段可以不用写
private int id;
private String name;
private int age;
//只要不是private的,都不会自动映射的
protected String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
其中需要注意的有2点:
1. id字段可以不用写的,系统会自动添加上。
2. 如果修饰符不是private,则不会自动映射到表中。
③.在src/main/目录下新建assets目录,新建litepal.xml配置文件
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="demo" ></dbname>
<version value="1" ></version>
<list>
<mapping class="com.example.litepaldemo.domain.Person"></mapping>
</list>
</litepal>
此配置文件中配置了数据库的名称为demo,版本号为1,并且将Person实体类映射到表中。
④.我们在MainActivity中调用下面一行代码就可以创建数据库了
SQLiteDatabase db = Connector.getDatabase();
最后我们去数据库看下我们创建好的一张表
至此,LitePal的基本用法已经介绍完毕,接下来我们看一下LitePal的升级(使用Sqlite升级还是比较繁琐的,如果升级过于频繁,需要在onUpgrade方法中写很长switch语句)
三、使用LitePal升级表
①.添加表
新建Student类如下,然后在litepal.xml中配置如下代码
public class Student {
private String id;
private String name;
private int age;
private String school;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
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;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="demo" ></dbname>
<version value="2" ></version>
<list>
<mapping class="com.example.litepaldemo.domain.Person"></mapping>
<mapping class="com.example.litepaldemo.domain.Student"></mapping>
</list>
</litepal>
我们用命令来查看一下当前数据库有几张表
查看person表,我们可以看出来没有sex列,因为sex列不是private修饰的
②.添加列
我们要在student表中添加一列,首先我们打开Student类,添加一个private的test字段,并提供get和set方法
然后更改litepal.xml文件中version标签的值为3,重新运行程序,得到如下结果。
③.删除列
将Student类中test字段和get和set方法去掉,更改litepal.xml中version标签的值为4,重新运行程序,得到如下结果。
注意:Sqlite本身不支持删除列,LitePal删除列原理是:先将student表重命名成一个临时表,然后根据最新的Student类的结构生成一个新的student表,再把临时表中除了test之外的数据复制到新的表中,最后把临时表删掉。
相信上面的讲解中,我们可以直观感觉出使用LitePal处理数据库的升级问题的便捷之处!
三.使用LitePal建立表关联
表与表之间的关联有三种类型:一对一、多对一、和多对多三种类型对应的实现方式:
一对一关联的实现方式用外键
多对一关联的实现方式用外键
多对多关联的实现方式用中间表
用面向对象的方式来处理三种关联类型:
一对一:在两个表对应的实体类的任何一方,引用另一个实体类即可。
多对一:用List集合将多的一方封装起来放在一的实体中,然后在多的实体中引用一的实体。
多对多:在两个表对应的实体中同时使用List集合引用另一方的实体。
举一个简单的列子来说明上述关系,我们在使用新闻类软件的时候都会发现这样的现象,每一条新闻都会唯一对应一条简介,这样我们就可以吧新闻表(News)和简介表(Introduction)看成一对一的关系。另外每一条新闻都可以有多条评论,这样我们就可以吧新闻表(News)和评论表(Comment)看成一对多的关系。还有就是每一条新闻都有可能在不同的分类中被查看到,而且每个分类中都会有多条新闻存在,这样我们就可以吧新闻表(News)和分类表(Category)看成多对多的关系了。下面我们用代码来描述这些表之间的关联。
一对一
①.新建News实体类,自动生成get set方法
private int id;
private String title;
private String content;
private int commentcount;
private Date publishdate;
private Introduction mIntroduction;
②.新建Introduction实体类,自动生成get set方法
private int id;
private String guide;
private String digest;
private int news_id;
③.编辑assets目录下litepal.xml文件,升级版本号,引用类
<litepal>
<dbname value="demo" ></dbname>
<version value="5" ></version>
<list>
<mapping class="com.example.litepaldemo.domain.Person"></mapping>
<mapping class="com.example.litepaldemo.domain.Student"></mapping>
<mapping class="com.example.litepaldemo.domain.Introduction"></mapping>
<mapping class="com.example.litepaldemo.domain.News"></mapping>
</list>
</litepal>
经过以上三个步骤,完成对表一对一的关联,下面我们去查看一下表中是否存在news_id关联
一对多
①.新建Comment实体类,自动生成get set方法
private int id;
private String content;
private Date publishdate;
private int news_id;
②.在News实体中使用List集合包装Comment实体,形成一对多的关系,自动生成get set 方法
private int id;
private String title;
private String content;
private int commentcount;
private Date publishdate;
private Introduction mIntroduction;
private List<Comment> commentList = new ArrayList<Comment>();
③.在litepal.xml中升级版本号,并引入实体bean
<litepal>
<dbname value="demo" ></dbname>
<version value="6" ></version>
<list>
<mapping class="com.example.litepaldemo.domain.Person"></mapping>
<mapping class="com.example.litepaldemo.domain.Student"></mapping>
<mapping class="com.example.litepaldemo.domain.Introduction"></mapping>
<mapping class="com.example.litepaldemo.domain.News"></mapping>
<mapping class="com.example.litepaldemo.domain.Comment"></mapping>
</list>
</litepal>
经过以上三个步骤,完成表一对多的关联,下面我们去查看一下表中是否存在此关联
多对多
①.新建实体类Category,自动生成get set方法
private int id;
private String name;
private List<News> newsList = new ArrayList<News>();
②.在News实体类中使用List集合包装Category,并自动生成get set方法
private int id;
private String title;
private String content;
private int commentcount;
private Date publishdate;
private Introduction mIntroduction;
private List<Comment> commentList = new ArrayList<Comment>();
private List<Category> categoryList = new ArrayList<Category>();
③.修改litepal.xml文件
<litepal>
<dbname value="demo" ></dbname>
<version value="7" ></version>
<list>
<mapping class="com.example.litepaldemo.domain.Person"></mapping>
<mapping class="com.example.litepaldemo.domain.Student"></mapping>
<mapping class="com.example.litepaldemo.domain.Introduction"></mapping>
<mapping class="com.example.litepaldemo.domain.News"></mapping>
<mapping class="com.example.litepaldemo.domain.Comment"></mapping>
<mapping class="com.example.litepaldemo.domain.Category"></mapping>
</list>
</litepal>
经过以上三个步骤,完成表多对多的关联,下面我们去查看一下表中是否存在此关联
以上就是我们如何用LitePal框架处理表间关联的了。