Android数据库高手秘籍(二):建立表和LitePal的基本用法

上一篇文章中咱们学习了一些Android数据库相关的基础知识,和几个颇为有用的SQLite命令,都是直接在命令行操做的。可是咱们都知道,数据库是要和程序结合在一块儿使用的,单独对一个数据库去进行増删改查操做并无什么意义,所以今天咱们就来学习一下如何在Android程序当中去操做SQLite数据库,还没看过前一篇文章的朋友能够先去参考 Android数据库高手秘籍(一)——SQLite命令 。java

操做数据库的第一步固然是建立表了,传统建立表的方法相信大多数人都知道,那么今天我除了会展现传统的建表方法以外,还会讲解LitePal这个框架的基本用法,并使用它来完成一样的建表操做,让你们体会到使用框架来操做数据库的魅力。android

那么先来简单介绍一下吧,LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将咱们平时开发时最经常使用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就能够完成各类建表、増删改查的操做。而且LitePal很“轻”,jar包只有100k不到,并且近乎零配置,这一点和Hibernate这类的框架有很大区别。目前LitePal的源码已经托管到了GitHub上,地址是 https://github.com/LitePalFramework/LitePal 。git

OK,简单介绍完了LitePal,咱们仍是先来看一下,在传统的Android开发中,须要怎么去建立表。程序员

传统的建表方式

其实为了方便咱们对数据库表进行管理,Android自己就提供了一个帮助类:SQLiteOpenHelper。这个类集建立和升级数据库于一身,而且自动管理了数据库版本,算是一个很是好用的工具。github

那咱们如今就来试试SQLiteOpenHelper的用法吧。首先你要知道SQLiteOpenHelper是一个抽象类,这意味着若是咱们想要使用它的话,就须要建立一个本身的帮助类去继承它。SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),咱们必须在本身的帮助类里面重写这两个方法,而后分别在这两个方法中去实现建立、升级数据库的逻辑。本篇文章只须要把注意力放在建立数据库这里就好了,升级数据库咱们会在下一篇文章中去讨论。数据库

新建一个MySQLiteHelper类并让它继承SQLiteOpenHelper,这样一个最基本的数据库帮助类的代码以下所示:编程

public class MySQLiteHelper extends SQLiteOpenHelper {  
 
    public MySQLiteHelper(Context context, String name, CursorFactory factory,  
            int version) {  
        super(context, name, factory, version);  
    }  
 
    @Override 
    public void onCreate(SQLiteDatabase db) {  
    }  
 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
    }  
 
}

其中,当数据库建立的时候会调用onCreate()方法,在这里去执行建表操做就能够了。好比说咱们想新建一张news表,其中有title,content,publishdate,commentcount这几列,分别表明着新闻标题、新闻内容、发布时间和评论数,那么代码就能够这样写:app

public class MySQLiteHelper extends SQLiteOpenHelper {  
 
    public static final String CREATE_NEWS = "create table news (" 
            + "id integer primary key autoincrement, " 
            + "title text, " 
            + "content text, " 
            + "publishdate integer," 
            + "commentcount integer)";  
 
    public MySQLiteHelper(Context context, String name, CursorFactory factory,  
            int version) {  
        super(context, name, factory, version);  
    }  
 
    @Override 
    public void onCreate(SQLiteDatabase db) {  
        db.execSQL(CREATE_NEWS);  
    }  
    ...  
}

能够看到,咱们把建表语句定义成了一个常量,而后在onCreate()方法中去执行了这条建表语句,news表也就建立成功了。这条建表语句虽然简单,可是里面仍是包含了一些小的细节,我来解释一下。首先,根据数据库的范式要求,任何一张表都应该是有主键的,因此这里咱们添加了一个自增加的id列,并把它设为主键。而后title列和content列都是字符串类型的,commentcount列是整型的,这都很好理解,可是publishdate列该怎么设计呢?因为SQLite中并不支持存储日期这种数据类型,所以咱们须要将日期先转换成UTC时间(自1970年1月1号零点)的毫秒数,而后再存储到数据库中,所以publishdate列也应该是整型的。框架

如今,咱们只须要获取到SQLiteDatabase的实例,数据库表就会自动建立了,以下所示:编程语言

SQLiteOpenHelper dbHelper = new MySQLiteHelper(this, "demo.db", null, 1);  
SQLiteDatabase db = dbHelper.getWritableDatabase();

感受很简单很方即是吗?那你就太容易知足了,下面咱们就来学习一下LitePal的基本用法,看一看使用这个框架是如何实现一样的功能的。

LitePal的基本用法

虽然说LitePal宣称是近乎零配置,但也只是“近乎”而已,它仍是须要进行一些简单配置才可使用的,那么咱们第一步就先快速学习一下LitePal的配置方法。

快速配置

1. 引入Jar包或源码

首先咱们须要将LitePal的jar包引入到项目当中,能够点击这里查看LitePal的最新版本,选择你须要的下载便可。下载好了jar包以后,把它复制到项目的libs目录中就算是引入成功了,以下图所示:

dgregreger2014090618gre3950781

若是你不想用jar包的话,也能够把LitePal的源码下载下来,而后做为一个library库导入到Eclipse当中,再让咱们的项目去引用这个library库就能够了。

2. 配置litepal.xml

接着在项目的assets目录下面新建一个litepal.xml文件,并将如下代码拷贝进去:

<?xml version="1.0" encoding="utf-8"?>  
<litepal>  
    <dbname value="demo" ></dbname>  
 
    <version value="1" ></version>  
 
    <list>  
    </list>  
</litepal>

配置文件至关简单,<dbname>用于设定数据库的名字,<version>用于设定数据库的版本号,<list>用于设定全部的映射模型,咱们稍后就会用到。

3. 配置LitePalApplication

因为操做数据库时须要用到Context,而咱们显然不但愿在每一个接口中都去传一遍这个参数,那样操做数据库就显得太繁琐了。所以,LitePal使用了一个方法来简化掉Context这个参数,只须要在AndroidManifest.xml中配置一下LitePalApplication,全部的数据库操做就都不用再传Context了,以下所示:

<manifest>  
    <application 
        android:name="org.litepal.LitePalApplication" 
        ...  
    >  
    ...  
    </application>  
</manifest>

固然,有些程序可能会有本身的Application,并在这里配置过了。好比说有一个MyApplication,以下所示:

<manifest>  
    <application 
        android:name="com.example.MyApplication" 
        ...  
    >  
    ...  
    </application>  
</manifest>

没有关系,这时只须要修改一下MyApplication的继承结构,让它不要直接继承Application类,而是继承LitePalApplication类,就可使用一切都能正常工做了,代码以下所示:

public class MyApplication extends LitePalApplication {  
    ...  
}

可是,有些程序可能会遇到一些更加极端的状况,好比说MyApplication须要继承另一个AnotherApplication,而且这个AnotherApplication仍是在jar包当中的,不能修改它的代码。这种状况应该算是比较少见了,可是若是你遇到了的话也不用急,仍然是有解释方案的。你能够把LitePal的源码下载下来,而后把src目录下的全部代码直接拷贝到你项目的src目录下面,接着打开LitePalApplication类,将它的继承结构改为继承自AnotherApplication,再让MyApplication继承自LitePalApplication,这样全部的Application就均可以在一块儿正常工做了。

仅仅三步,咱们就将全部的配置工做所有完成了,而且这是一件一本万利的事情,自此之后,你就能够开心地体验LitePal提供的各类便利了,就让咱们从建表开始吧。

开始建表

前面在介绍的时候已经说了,LitePal采起的是对象关系映射(ORM)的模式,那么什么是对象关系映射呢?简单点说,咱们使用的编程语言是面向对象语言,而咱们使用的数据库则是关系型数据库,那么将面向对象的语言和面向关系的数据库之间创建一种映射关系,这就是对象关系映射了。

可是咱们为何要使用对象关系映射模式呢?这主要是由于大多数的程序员都很擅长面向对象编程,但其中只有少部分的人才比较精通关系型数据库。并且数据库的SQL语言晦涩难懂,就算你很精通它,恐怕也不喜欢常常在代码中去写它吧?而对象关系映射模式则很好地解决了这个问题,它容许咱们使用面向对象的方式来操做数据库,从而能够从晦涩难懂的SQL语言中解脱出来。

那么接下来咱们就看一看LitePal中是如何建表的吧。根据对象关系映射模式的理念,每一张表都应该对应一个模型(Model),也就是说,若是咱们想要建一张news表,就应该有一个对应的News模型类。新建一个News类,以下所示:

package com.example.databasetest.model;  
 
public class News {  
}

而后,表中的每一列其实就是对应了模型类中的一个字段,好比news表中有id、title、content、publishdate、commentcount这几个列,那么在News类中就也应该有这几个字段,代码以下所示:

public class News {  
 
    private int id;  
 
    private String title;  
 
    private String content;  
 
    private Date publishDate;  
 
    private int commentCount;  
 
    // 自动生成get、set方法  
    ...  
}

其中id这个字段可写可不写,由于即便不写这个字段,LitePal也会在表中自动生成一个id列,毕竟每张表都必定要有主键的嘛。

这里我要特别说明一下,LitePal的映射规则是很是轻量级的,不像一些其它的数据库框架,须要为每一个模型类单独配置一个映射关系的XML,LitePal的全部映射都是自动完成的。根据LitePal的数据类型支持,能够进行对象关系映射的数据类型一共有8种,int、short、long、float、double、boolean、String和Date。只要是声明成这8种数据类型的字段都会被自动映射到数据库表中,并不须要进行任何额外的配置。

那么有的朋友可能会问了,既然是自动映射的话,若是News类中有一个字符串字段我并不想让它映射到数据库表中,这该怎么办呢?对此,LitePal一样采用了一种极为轻量的解决方案,只有声明成private修饰符的字段才会被映射到数据库表中,若是你有某一个字段不想映射的话,只须要将它改为public、protected或default修饰符就能够了。

如今模型类已经建好了,咱们还差最后一步,就是将它配置到映射列表当中。编辑assets目录下的litepal.xml文件,在<list>标签中加入News模型类的声明:

<?xml version="1.0" encoding="utf-8"?>  
<litepal>  
    <dbname value="demo" ></dbname>  
 
    <version value="1" ></version>  
 
    <list>  
        <mapping class="com.example.databasetest.model.News"></mapping>  
    </list>  
</litepal>

注意这里必定要填入News类的完整类名。

OK,这样全部的工做就都已经完成了,如今只要你对数据库有任何的操做,news表就会被自动建立出来。好比说LitePal提供了一个便捷的方法来获取到SQLiteDatabase的实例,以下所示:

SQLiteDatabase db = Connector.getDatabase();

调用一下上述代码,news表就应该已经建立成功了。咱们使用在上一篇文章中学到的SQLite命令来查看一下,打开demo.db数据库,输入.table命令,结果以下图所示:

能够看到,news表已经存在了。另外两张android_metadata和table_schema表是自动生成的,咱们不用理。接下来咱们还能够再查询一下news表的建表语句,以下图所示:

ewfweger201409072he22630369

这就是LitePal根据News类中的字段自动帮咱们生成的建表语句,由此也说明,建表操做已经成功完成了。

好了,到目前为止你已经算是对LitePal的用法有点入门了,那么本篇文章的内容就到这里,下篇文章当中咱们将学习使用LitePal进行升级表的操做。

相关文章
相关标签/搜索