我們學習了一些Android數(shù)據(jù)庫相關的基礎知識,和幾個頗為有用的SQLite命令,都是直接在命令行操作的。但是我們都知道,數(shù)據(jù)庫是要和程序結(jié)合在一起使用的,單獨對一個數(shù)據(jù)庫去進行増刪改查操作并沒有什么意義,因此今天我們就來學習一下如何在Android程序當中去操作SQLite數(shù)據(jù)庫,還沒看過前一篇文章的朋友可以先去參考 Android數(shù)據(jù)庫高手秘籍(一)——SQLite命令 。
操作數(shù)據(jù)庫的第一步當然是創(chuàng)建表了,傳統(tǒng)創(chuàng)建表的方法相信大多數(shù)人都知道,那么今天我除了會展示傳統(tǒng)的建表方法之外,還會講解LitePal這個框架的基本用法,并使用它來完成同樣的建表操作,讓大家體會到使用框架來操作數(shù)據(jù)庫的魅力。
那么先來簡單介紹一下吧,LitePal是一款開源的Android數(shù)據(jù)庫框架,它采用了對象關系映射(ORM)的模式,并將我們平時開發(fā)時最常用到的一些數(shù)據(jù)庫功能進行了封裝,使得不用編寫一行SQL語句就可以完成各種建表、増刪改查的操作。并且LitePal很“輕”,jar包只有100k不到,而且近乎零配置,這一點和Hibernate這類的框架有很大區(qū)別。目前LitePal的源碼已經(jīng)托管到了GitHub上,地址是 https://github.com/LitePalFramework/LitePal 。
OK,簡單介紹完了LitePal,我們還是先來看一下,在傳統(tǒng)的Android開發(fā)中,需要怎么去創(chuàng)建表。
其實為了方便我們對數(shù)據(jù)庫表進行管理,Android本身就提供了一個幫助類:SQLiteOpenHelper。這個類集創(chuàng)建和升級數(shù)據(jù)庫于一身,并且自動管理了數(shù)據(jù)庫版本,算是一個非常好用的工具。
那我們現(xiàn)在就來試試SQLiteOpenHelper的用法吧。首先你要知道SQLiteOpenHelper是一個抽象類,這意味著如果我們想要使用它的話,就需要創(chuàng)建一個自己的幫助類去繼承它。SQLiteOpenHelper中有兩個抽象方法,分別是onCreate()和onUpgrade(),我們必須在自己的幫助類里面重寫這兩個方法,然后分別在這兩個方法中去實現(xiàn)創(chuàng)建、升級數(shù)據(jù)庫的邏輯。本篇文章只需要把注意力放在創(chuàng)建數(shù)據(jù)庫這里就行了,升級數(shù)據(jù)庫我們會在下一篇文章中去討論。
新建一個MySQLiteHelper類并讓它繼承SQLiteOpenHelper,這樣一個最基本的數(shù)據(jù)庫幫助類的代碼如下所示:
?| 12345678910111213141516 | publicclassMySQLiteHelper extendsSQLiteOpenHelper {    publicMySQLiteHelper(Context context, String name, CursorFactory factory,            intversion) {        super(context, name, factory, version);    }    @Override    publicvoidonCreate(SQLiteDatabase db) {    }    @Override    publicvoidonUpgrade(SQLiteDatabase db, intoldVersion, intnewVersion) {    }} | 
| 1234567891011121314151617181920 | publicclassMySQLiteHelper extendsSQLiteOpenHelper {        publicstaticfinalString CREATE_NEWS = create table news (            + id integer PRimary key autoincrement,             + title text,             + content text,             + publishdate integer,            + commentcount integer);    publicMySQLiteHelper(Context context, String name, CursorFactory factory,            intversion) {        super(context, name, factory, version);    }    @Override    publicvoidonCreate(SQLiteDatabase db) {        db.execSQL(CREATE_NEWS);    }    ...} | 
現(xiàn)在,我們只需要獲取到SQLiteDatabase的實例,數(shù)據(jù)庫表就會自動創(chuàng)建了,如下所示:
?| 12 | SQLiteOpenHelper dbHelper = newMySQLiteHelper(this, demo.db, null,1);SQLiteDatabase db = dbHelper.getWritableDatabase(); | 
感覺很簡單很方便是嗎?那你就太容易滿足了,下面我們就來學習一下LitePal的基本用法,看一看使用這個框架是如何實現(xiàn)同樣的功能的。
雖說LitePal宣稱是近乎零配置,但也只是“近乎”而已,它還是需要進行一些簡單配置才可以使用的,那么我們第一步就先快速學習一下LitePal的配置方法。
1. 引入Jar包或源碼
首先我們需要將LitePal的jar包引入到項目當中,可以點擊這里查看LitePal的最新版本,選擇你需要的下載即可。下載好了jar包之后,把它復制到項目的libs目錄中就算是引入成功了,如下圖所示:

如果你不想用jar包的話,也可以把LitePal的源碼下載下來,然后作為一個library庫導入到Eclipse當中,再讓我們的項目去引用這個library庫就可以了。
2. 配置litepal.xml
接著在項目的assets目錄下面新建一個litepal.xml文件,并將以下代碼拷貝進去:
?| 123456789 | <!--?xml version=1.0encoding=utf-8?--><litepal>    <dbname value="demo"></dbname>    <version value="1"></version>    <list>    </list></litepal> | 
3. 配置LitePalapplication
由于操作數(shù)據(jù)庫時需要用到Context,而我們顯然不希望在每個接口中都去傳一遍這個參數(shù),那樣操作數(shù)據(jù)庫就顯得太繁瑣了。因此,LitePal使用了一個方法來簡化掉Context這個參數(shù),只需要在AndroidManifest.xml中配置一下LitePalApplication,所有的數(shù)據(jù)庫操作就都不用再傳Context了,如下所示:
?| 12345 | <manifest>        ...    </application></manifest> | 
| 12345 | <manifest>        ...    </application></manifest> | 
| 123 | publicclassMyApplication extendsLitePalApplication {    ...} | 
但是,有些程序可能會遇到一些更加極端的情況,比如說MyApplication需要繼承另外一個AnotherApplication,并且這個AnotherApplication還是在jar包當中的,不能修改它的代碼。這種情況應該算是比較少見了,但是如果你遇到了的話也不用急,仍然是有解釋方案的。你可以把LitePal的源碼下載下來,然后把src目錄下的所有代碼直接拷貝到你項目的src目錄下面,接著打開LitePalApplication類,將它的繼承結(jié)構(gòu)改成繼承自AnotherApplication,再讓MyApplication繼承自LitePalApplication,這樣所有的Application就都可以在一起正常工作了。
僅僅三步,我們就將所有的配置工作全部完成了,并且這是一件一本萬利的事情,自此以后,你就可以開心地體驗LitePal提供的各種便利了,就讓我們從建表開始吧。
前面在介紹的時候已經(jīng)說了,LitePal采取的是對象關系映射(ORM)的模式,那么什么是對象關系映射呢?簡單點說,我們使用的編程語言是面向?qū)ο笳Z言,而我們使用的數(shù)據(jù)庫則是關系型數(shù)據(jù)庫,那么將面向?qū)ο蟮恼Z言和面向關系的數(shù)據(jù)庫之間建立一種映射關系,這就是對象關系映射了。
但是我們?yōu)槭裁匆褂脤ο箨P系映射模式呢?這主要是因為大多數(shù)的程序員都很擅長面向?qū)ο缶幊蹋渲兄挥猩俨糠值娜瞬疟容^精通關系型數(shù)據(jù)庫。而且數(shù)據(jù)庫的SQL語言晦澀難懂,就算你很精通它,恐怕也不喜歡經(jīng)常在代碼中去寫它吧?而對象關系映射模式則很好地解決了這個問題,它允許我們使用面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù)庫,從而可以從晦澀難懂的SQL語言中解脫出來。
那么接下來我們就看一看LitePal中是如何建表的吧。根據(jù)對象關系映射模式的理念,每一張表都應該對應一個模型(Model),也就是說,如果我們想要建一張news表,就應該有一個對應的News模型類。新建一個News類,如下所示:
?| 1234 | packagecom.example.databasetest.model;publicclassNews {} | 
| 123456789101112131415 | publicclassNews {        privateintid;        privateString title;        privateString content;        privateDate publishDate;        privateintcommentCount;        // 自動生成get、set方法    ...} | 
這里我要特別說明一下,LitePal的映射規(guī)則是非常輕量級的,不像一些其它的數(shù)據(jù)庫框架,需要為每個模型類單獨配置一個映射關系的XML,LitePal的所有映射都是自動完成的。根據(jù)LitePal的數(shù)據(jù)類型支持,可以進行對象關系映射的數(shù)據(jù)類型一共有8種,int、short、long、float、double、boolean、String和Date。只要是聲明成這8種數(shù)據(jù)類型的字段都會被自動映射到數(shù)據(jù)庫表中,并不需要進行任何額外的配置。
那么有的朋友可能會問了,既然是自動映射的話,如果News類中有一個字符串字段我并不想讓它映射到數(shù)據(jù)庫表中,這該怎么辦呢?對此,LitePal同樣采用了一種極為輕量的解決方案,只有聲明成private修飾符的字段才會被映射到數(shù)據(jù)庫表中,如果你有某一個字段不想映射的話,只需要將它改成public、protected或default修飾符就可以了。
現(xiàn)在模型類已經(jīng)建好了,我們還差最后一步,就是將它配置到映射列表當中。編輯assets目錄下的litepal.xml文件,在標簽中加入News模型類的聲明:
?| 12345678910 | <!--?xml version=1.0encoding=utf-8?--><litepal>    <dbname value="demo"></dbname>    <version value="1"></version>    <list>        <mappingclass="com.example.databasetest.model.News"></mapping>    </list></litepal> | 
OK,這樣所有的工作就都已經(jīng)完成了,現(xiàn)在只要你對數(shù)據(jù)庫有任何的操作,news表就會被自動創(chuàng)建出來。比如說LitePal提供了一個便捷的方法來獲取到SQLiteDatabase的實例,如下所示:
?| 1 | SQLiteDatabase db = Connector.getDatabase(); | 

可以看到,news表已經(jīng)存在了。另外兩張android_metadata和table_schema表是自動生成的,我們不用理。接下來我們還可以再查詢一下news表的建表語句,如下圖所示:

這就是LitePal根據(jù)News類中的字段自動幫我們生成的建表語句,由此也說明,建表操作已經(jīng)成功完成了。
好了,到目前為止你已經(jīng)算是對LitePal的用法有點入門了,那么本篇文章的內(nèi)容就到這里,下篇文章當中我們將學習使用LitePal進行升級表的操作。
新聞熱點
疑難解答