開源數據庫LitePal的使用教程
開源地址:https://github.com/LitePalFramework/LitePal
一. LitePal的快速配置
1. 引入Jar包或源碼
使用Android Studio在項目的build.gradle中添加:
dependencies {
compile 'org.litepal.android:core:1.3.0'
}
使用Eclipse到這裏下載好了jar包之後,把它複製到項目的libs目錄中就算是引入成功了。
2. 配置litepal.xml
在項目的assets目錄下面新建一個litepal.xml文件,內容如下:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="demo" ></dbname>
<version value="1" ></version>
<list>
<mapping class="org.litepal.litepalsample.model.Album"></mapping>
<mapping class="org.litepal.litepalsample.model.Song"></mapping>
</list>
</litepal>
————————標籤說明—————————
<dbname>是數據庫的名字
<version>是數據庫的版本號
<list>是數據庫的映射模型(數據庫表)
<mapping>是數據庫的映射模型的地址(數據庫表結構)
3. 配置LitePalApplication
在AndroidManifest.xml中配置LitePalApplication,如下:
<manifest>
<application
android:name="org.litepal.LitePalApplication"
...
>
...
</application>
</manifest>
如果已經有自己的Application,那麼久繼承一下就好了,如下:
public class MyApplication extends LitePalApplication {
...
}
二. LitePal的建表
根據對象關係映射模式的理念,每一張表都應該對應一個模型(Model),建表先要新建一個模型類,新建一個DEST類,如下:
public class DEST extends DataSupport {
private String destId;//目的地ID
private String cnName;//中文名
private String enName;//英文名
private String parentId;
private String childrenId;
private long updateTime;
// 自動生成get、set方法
}
LitePal的映射規則是非常輕量級的,不像一些其它的數據庫框架,需要爲每個模型類單獨配置一個映射關係的XML,LitePal的所有映射都是自動完成的。根據LitePal的數據類型支持,可以進行對象關係映射的數據類型一共有8種,int、short、long、float、double、boolean、String和Date。只要是聲明成這8種數據類型的字段都會被自動映射到數據庫表中,並不需要進行任何額外的配置。
注意
只有private修飾的字段纔會被映射到數據庫表中,即如果有某一個字段不想映射的話,就設置爲public、protected或者default修飾符就可以了。
建立好Model後,我們就把他配置到映射列表中,即編輯assest目錄下的litepal.xml文件,在<list>標籤中加入DEST類的聲明,這裏要注意,要類的完整類名。
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="white" ></dbname>
<version value="1" ></version>
<list>
<mapping class="com.whitelaning.example.litepal.DEST"></mapping>
</list>
</litepal>
到這裏,就完成了LitePal數據庫的配置。
三. LitePal的升級表
1.添加新表
首先創建一個新的模型類,然後把它設置到litepal.xml中,如下:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="white" ></dbname>
<version value="1" ></version>
<list>
<mapping class="com.whitelaning.example.litepal.DEST"></mapping>
<mapping class="com.whitelaning.example.litepal.SHOPPING"></mapping>
</list>
</litepal>
然後,把litepal.xml中的version的值加一即可,如下:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="white" ></dbname>
<version value="2" ></version>
<list>
<mapping class="com.whitelaning.example.litepal.DEST"></mapping>
<mapping class="com.whitelaning.example.litepal.SHOPPING"></mapping>
</list>
</litepal>
2.舊錶添加新列
首先在需要升級的模型類中添加新的private修飾的字段,如下:
public class DEST extends DataSupport {
private String destId;//目的地ID
private String cnName;//中文名
private String enName;//英文名
private String parentId;
private String childrenId;
private long updateTime;
private String imagePath;//(新增加的列)
// 自動生成get、set方法
}
然後再把litepal.xml中的version的值加一即可,如下:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="white" ></dbname>
<version value="3" ></version>
<list>
<mapping class="com.whitelaning.example.litepal.DEST"></mapping>
<mapping class="com.whitelaning.example.litepal.SHOPPING"></mapping>
</list>
</litepal>
四. LitePal的存儲操作
LitePal要存儲數據,首先模型類要繼承DataSupport,即:
public class DEST extends DataSupport {
}
繼承了DataSupport類之後,這些實體類就擁有了進行CRUD操作的能力。
存儲操作:
DEST mDest = new DEST();
mDest.setDestId("123421");
mDest.save();
並且save()操作是有返回值的,所以可以這樣:
if (mDest.save()) {
Toast.makeText(context, "存儲成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "存儲失敗", Toast.LENGTH_SHORT).show();
}
五. LitePal的修改操作
如果想把DEST表中id爲4的destId改爲"1",可以這樣寫:
ContentValues values = new ContentValues();
values.put("destId", "1");
DataSupport.update(DEST.class, values, 4);
//或者用下面這種方法
DEST updateNews = new DEST();
updateNews.setDestId("1");
updateNews.update(4);
如果想把DEST表中所有destId爲"1"的改爲"2"可以這樣寫:
ContentValues values = new ContentValues();
values.put("destId", "2");
DataSupport.updateAll(DEST.class, values, "destId = ?", "1");
//或者用下面這種方法
DEST updateNews = new DEST();
updateNews.setdestId("2");
updateNews.updateAll("destId = ?", "1");
六. LitePal的刪除操作
比如說我們想刪除DEST表中id爲2的記錄,就可以這樣寫:
DataSupport.delete(News.class, 2);
想把DEST表中destId爲“1”的所有數據刪除,就可以這樣寫:
DataSupport.deleteAll(DEST.class, "destId = ? ", "1");
如果我們想把DEST表中所有的數據全部刪除掉,就可以這樣寫:
DataSupport.deleteAll(DEST.class);
七. LitePal的查詢操作
查詢DEST表中id爲1的這條記錄,使用LitePal就可以這樣寫:
DEST mDest = DataSupport.find(DEST.class, 1);
想要獲取DEST表中的第一條數據,只需要這樣寫:
DEST firstDest = DataSupport.findFirst(DEST.class);
想要獲取News表中的最後一條數據,只需要這樣寫:
DEST lastDest = DataSupport.findLast(DEST.class);
想把DEST表中id爲1、3、5、7的數據都查出來,只需要這樣寫:
List<DEST> mDestList = DataSupport.findAll(DEST.class, 1, 3, 5, 7);
查詢所有數據,只需要這樣寫:
List<DEST> mDestList = DataSupport.findAll(DEST.class);
想查詢DEST表中所有父類id爲"1"的數據,就可以這樣寫:
List<DEST> mDestList = DataSupport.where("parentId = ?", "1").find(DEST.class);
許你並不需要那麼多的數據,而是隻要cnName和enName這兩列數據。那麼也很簡單,我們只要再增加一個連綴就行了,如下所示:
List<DEST> mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").find(DEST.class);
也許你還要數據按照添加的時間倒序排列,那麼可以這樣:
List<DEST> mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").find(DEST.class);
數據太多了,其實你只要前10行就行了,那麼可以這樣:
List<DEST> mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").limit(10).find(DEST.class);
如果我們想進行分頁展示,那麼翻頁了,怎麼辦?可以添加一個偏移量就好了,這樣:
List<DEST> mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").limit(10).offset(10).find(DEST.class);
八. LitePal的聚合函數
count()
如果想統計行數,那麼就可以調用count()即可:
int result = DataSupport.count(DEST.class);
如果想統計parentId爲"1"的數據的行數,那麼可以這樣:
int result = DataSupport.where("parentId = ?", "1").count(DEST.class);
sum()
如果想統計一下DEST表中,所有updateTime的和(雖然毫無用處....),那麼可以這樣:
long result = DataSupport.sum(DEST.class, "updateTime", long.class);
注意
第一個參數很簡單,還是傳入的Class,用於指定去統計哪張表當中的數據。第二個參數是列名,表示我們希望對哪一個列中的數據進行求合。第三個參數用於指定結果的類型,這裏我們指定成int型,因此返回結果也是int型。
sum()方法只能對具有運算能力的列進行求合,比如說整型列或者浮點型列,如果你傳入一個字符串類型的列去求合,肯定是得不到任何結果的,這時只會返回一個0作爲結果。
剩下的聚合函數方法大同小異了:
average()
max()
min()
...