Android数据库高手秘籍(二):创建表和LitePal的基本用法
原文:http://blog.jobbole.com/77157/
上一篇文章中我們學(xué)習(xí)了一些Android數(shù)據(jù)庫相關(guān)的基礎(chǔ)知識(shí),和幾個(gè)頗為有用的SQLite命令,都是直接在命令行操作的。但是我們都知道,數(shù)據(jù)庫是要和程序結(jié)合在一起使用的,單獨(dú)對(duì)一個(gè)數(shù)據(jù)庫去進(jìn)行増刪改查操作并沒有什么意義,因此今天我們就來學(xué)習(xí)一下如何在Android程序當(dāng)中去操作SQLite數(shù)據(jù)庫,還沒看過前一篇文章的朋友可以先去參考?Android數(shù)據(jù)庫高手秘籍(一)——SQLite命令?。
操作數(shù)據(jù)庫的第一步當(dāng)然是創(chuàng)建表了,傳統(tǒng)創(chuàng)建表的方法相信大多數(shù)人都知道,那么今天我除了會(huì)展示傳統(tǒng)的建表方法之外,還會(huì)講解LitePal這個(gè)框架的基本用法,并使用它來完成同樣的建表操作,讓大家體會(huì)到使用框架來操作數(shù)據(jù)庫的魅力。
那么先來簡單介紹一下吧,LitePal是一款開源的Android數(shù)據(jù)庫框架,它采用了對(duì)象關(guān)系映射(ORM)的模式,并將我們平時(shí)開發(fā)時(shí)最常用到的一些數(shù)據(jù)庫功能進(jìn)行了封裝,使得不用編寫一行SQL語句就可以完成各種建表、増刪改查的操作。并且LitePal很“輕”,jar包只有100k不到,而且近乎零配置,這一點(diǎn)和Hibernate這類的框架有很大區(qū)別。目前LitePal的源碼已經(jīng)托管到了GitHub上,地址是?https://github.com/LitePalFramework/LitePal?。
OK,簡單介紹完了LitePal,我們還是先來看一下,在傳統(tǒng)的Android開發(fā)中,需要怎么去創(chuàng)建表。
傳統(tǒng)的建表方式
其實(shí)為了方便我們對(duì)數(shù)據(jù)庫表進(jìn)行管理,Android本身就提供了一個(gè)幫助類:SQLiteOpenHelper。這個(gè)類集創(chuàng)建和升級(jí)數(shù)據(jù)庫于一身,并且自動(dòng)管理了數(shù)據(jù)庫版本,算是一個(gè)非常好用的工具。
那我們現(xiàn)在就來試試SQLiteOpenHelper的用法吧。首先你要知道SQLiteOpenHelper是一個(gè)抽象類,這意味著如果我們想要使用它的話,就需要?jiǎng)?chuàng)建一個(gè)自己的幫助類去繼承它。SQLiteOpenHelper中有兩個(gè)抽象方法,分別是onCreate()和onUpgrade(),我們必須在自己的幫助類里面重寫這兩個(gè)方法,然后分別在這兩個(gè)方法中去實(shí)現(xiàn)創(chuàng)建、升級(jí)數(shù)據(jù)庫的邏輯。本篇文章只需要把注意力放在創(chuàng)建數(shù)據(jù)庫這里就行了,升級(jí)數(shù)據(jù)庫我們會(huì)在下一篇文章中去討論。
新建一個(gè)MySQLiteHelper類并讓它繼承SQLiteOpenHelper,這樣一個(gè)最基本的數(shù)據(jù)庫幫助類的代碼如下所示:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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) {? ????}? } |
其中,當(dāng)數(shù)據(jù)庫創(chuàng)建的時(shí)候會(huì)調(diào)用onCreate()方法,在這里去執(zhí)行建表操作就可以了。比如說我們想新建一張news表,其中有title,content,publishdate,commentcount這幾列,分別代表著新聞標(biāo)題、新聞內(nèi)容、發(fā)布時(shí)間和評(píng)論數(shù),那么代碼就可以這樣寫:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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);? ????}? ????...? } |
現(xiàn)在,我們只需要獲取到SQLiteDatabase的實(shí)例,數(shù)據(jù)庫表就會(huì)自動(dòng)創(chuàng)建了,如下所示:
| 1 2 | SQLiteOpenHelper dbHelper = new MySQLiteHelper(this, "demo.db", null, 1);? SQLiteDatabase db = dbHelper.getWritableDatabase(); |
感覺很簡單很方便是嗎?那你就太容易滿足了,下面我們就來學(xué)習(xí)一下LitePal的基本用法,看一看使用這個(gè)框架是如何實(shí)現(xiàn)同樣的功能的。
LitePal的基本用法
雖說LitePal宣稱是近乎零配置,但也只是“近乎”而已,它還是需要進(jìn)行一些簡單配置才可以使用的,那么我們第一步就先快速學(xué)習(xí)一下LitePal的配置方法。
快速配置
1. 引入Jar包或源碼
首先我們需要將LitePal的jar包引入到項(xiàng)目當(dāng)中,可以點(diǎn)擊這里查看LitePal的最新版本,選擇你需要的下載即可。下載好了jar包之后,把它復(fù)制到項(xiàng)目的libs目錄中就算是引入成功了,如下圖所示:
如果你不想用jar包的話,也可以把LitePal的源碼下載下來,然后作為一個(gè)library庫導(dǎo)入到Eclipse當(dāng)中,再讓我們的項(xiàng)目去引用這個(gè)library庫就可以了。
2. 配置litepal.xml
接著在項(xiàng)目的assets目錄下面新建一個(gè)litepal.xml文件,并將以下代碼拷貝進(jìn)去:
| 1 2 3 4 5 6 7 8 9 | <?xml version="1.0" encoding="utf-8"?>? <litepal>? ????<dbname value="demo" ></dbname>? ????<version value="1" ></version>? ????<list>? ????</list>? </litepal> |
配置文件相當(dāng)簡單,<dbname>用于設(shè)定數(shù)據(jù)庫的名字,<version>用于設(shè)定數(shù)據(jù)庫的版本號(hào),<list>用于設(shè)定所有的映射模型,我們稍后就會(huì)用到。
3. 配置LitePalApplication
由于操作數(shù)據(jù)庫時(shí)需要用到Context,而我們顯然不希望在每個(gè)接口中都去傳一遍這個(gè)參數(shù),那樣操作數(shù)據(jù)庫就顯得太繁瑣了。因此,LitePal使用了一個(gè)方法來簡化掉Context這個(gè)參數(shù),只需要在AndroidManifest.xml中配置一下LitePalApplication,所有的數(shù)據(jù)庫操作就都不用再傳Context了,如下所示:
| 1 2 3 4 5 6 7 8 | <manifest>? ????<application? ????????android:name="org.litepal.LitePalApplication"? ????????...? ????>? ????...? ????</application>? </manifest> |
當(dāng)然,有些程序可能會(huì)有自己的Application,并在這里配置過了。比如說有一個(gè)MyApplication,如下所示:
| 1 2 3 4 5 6 7 8 | <manifest>? ????<application? ????????android:name="com.example.MyApplication"? ????????...? ????>? ????...? ????</application>? </manifest> |
沒有關(guān)系,這時(shí)只需要修改一下MyApplication的繼承結(jié)構(gòu),讓它不要直接繼承Application類,而是繼承LitePalApplication類,就可以使用一切都能正常工作了,代碼如下所示:
| 1 2 3 | public class MyApplication extends LitePalApplication {? ????...? } |
但是,有些程序可能會(huì)遇到一些更加極端的情況,比如說MyApplication需要繼承另外一個(gè)AnotherApplication,并且這個(gè)AnotherApplication還是在jar包當(dāng)中的,不能修改它的代碼。這種情況應(yīng)該算是比較少見了,但是如果你遇到了的話也不用急,仍然是有解釋方案的。你可以把LitePal的源碼下載下來,然后把src目錄下的所有代碼直接拷貝到你項(xiàng)目的src目錄下面,接著打開LitePalApplication類,將它的繼承結(jié)構(gòu)改成繼承自AnotherApplication,再讓MyApplication繼承自LitePalApplication,這樣所有的Application就都可以在一起正常工作了。
僅僅三步,我們就將所有的配置工作全部完成了,并且這是一件一本萬利的事情,自此以后,你就可以開心地體驗(yàn)LitePal提供的各種便利了,就讓我們從建表開始吧。
開始建表
前面在介紹的時(shí)候已經(jīng)說了,LitePal采取的是對(duì)象關(guān)系映射(ORM)的模式,那么什么是對(duì)象關(guān)系映射呢?簡單點(diǎn)說,我們使用的編程語言是面向?qū)ο笳Z言,而我們使用的數(shù)據(jù)庫則是關(guān)系型數(shù)據(jù)庫,那么將面向?qū)ο蟮恼Z言和面向關(guān)系的數(shù)據(jù)庫之間建立一種映射關(guān)系,這就是對(duì)象關(guān)系映射了。
但是我們?yōu)槭裁匆褂脤?duì)象關(guān)系映射模式呢?這主要是因?yàn)榇蠖鄶?shù)的程序員都很擅長面向?qū)ο缶幊?#xff0c;但其中只有少部分的人才比較精通關(guān)系型數(shù)據(jù)庫。而且數(shù)據(jù)庫的SQL語言晦澀難懂,就算你很精通它,恐怕也不喜歡經(jīng)常在代碼中去寫它吧?而對(duì)象關(guān)系映射模式則很好地解決了這個(gè)問題,它允許我們使用面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù)庫,從而可以從晦澀難懂的SQL語言中解脫出來。
那么接下來我們就看一看LitePal中是如何建表的吧。根據(jù)對(duì)象關(guān)系映射模式的理念,每一張表都應(yīng)該對(duì)應(yīng)一個(gè)模型(Model),也就是說,如果我們想要建一張news表,就應(yīng)該有一個(gè)對(duì)應(yīng)的News模型類。新建一個(gè)News類,如下所示:
| 1 2 3 4 | package com.example.databasetest.model;? public class News {? } |
然后,表中的每一列其實(shí)就是對(duì)應(yīng)了模型類中的一個(gè)字段,比如news表中有id、title、content、publishdate、commentcount這幾個(gè)列,那么在News類中就也應(yīng)該有這幾個(gè)字段,代碼如下所示:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class News {? ????private int id;? ????private String title;? ????private String content;? ????private Date publishDate;? ????private int commentCount;? ????// 自動(dòng)生成get、set方法? ????...? } |
其中id這個(gè)字段可寫可不寫,因?yàn)榧词共粚戇@個(gè)字段,LitePal也會(huì)在表中自動(dòng)生成一個(gè)id列,畢竟每張表都一定要有主鍵的嘛。
這里我要特別說明一下,LitePal的映射規(guī)則是非常輕量級(jí)的,不像一些其它的數(shù)據(jù)庫框架,需要為每個(gè)模型類單獨(dú)配置一個(gè)映射關(guān)系的XML,LitePal的所有映射都是自動(dòng)完成的。根據(jù)LitePal的數(shù)據(jù)類型支持,可以進(jìn)行對(duì)象關(guān)系映射的數(shù)據(jù)類型一共有8種,int、short、long、float、double、boolean、String和Date。只要是聲明成這8種數(shù)據(jù)類型的字段都會(huì)被自動(dòng)映射到數(shù)據(jù)庫表中,并不需要進(jìn)行任何額外的配置。
那么有的朋友可能會(huì)問了,既然是自動(dòng)映射的話,如果News類中有一個(gè)字符串字段我并不想讓它映射到數(shù)據(jù)庫表中,這該怎么辦呢?對(duì)此,LitePal同樣采用了一種極為輕量的解決方案,只有聲明成private修飾符的字段才會(huì)被映射到數(shù)據(jù)庫表中,如果你有某一個(gè)字段不想映射的話,只需要將它改成public、protected或default修飾符就可以了。
現(xiàn)在模型類已經(jīng)建好了,我們還差最后一步,就是將它配置到映射列表當(dāng)中。編輯assets目錄下的litepal.xml文件,在<list>標(biāo)簽中加入News模型類的聲明:
| 1 2 3 4 5 6 7 8 9 10 | <?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,這樣所有的工作就都已經(jīng)完成了,現(xiàn)在只要你對(duì)數(shù)據(jù)庫有任何的操作,news表就會(huì)被自動(dòng)創(chuàng)建出來。比如說LitePal提供了一個(gè)便捷的方法來獲取到SQLiteDatabase的實(shí)例,如下所示:
| 1 | SQLiteDatabase db = Connector.getDatabase(); |
調(diào)用一下上述代碼,news表就應(yīng)該已經(jīng)創(chuàng)建成功了。我們使用在上一篇文章中學(xué)到的SQLite命令來查看一下,打開demo.db數(shù)據(jù)庫,輸入.table命令,結(jié)果如下圖所示:
可以看到,news表已經(jīng)存在了。另外兩張android_metadata和table_schema表是自動(dòng)生成的,我們不用理。接下來我們還可以再查詢一下news表的建表語句,如下圖所示:
這就是LitePal根據(jù)News類中的字段自動(dòng)幫我們生成的建表語句,由此也說明,建表操作已經(jīng)成功完成了。
好了,到目前為止你已經(jīng)算是對(duì)LitePal的用法有點(diǎn)入門了,那么本篇文章的內(nèi)容就到這里,下篇文章當(dāng)中我們將學(xué)習(xí)使用LitePal進(jìn)行升級(jí)表的操作。
轉(zhuǎn)載于:https://www.cnblogs.com/mochaMM/p/5110391.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Android数据库高手秘籍(二):创建表和LitePal的基本用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有关ftp4j的FTPListParse
- 下一篇: Android开发之 当前日期Strin