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進行升級表的操做。

相關文章
相關標籤/搜索