1.第一步先在項(xiàng)目build.gradle集成? ? compile'org.litepal.android:core:1.6.1'
2.創(chuàng)建assets目錄,創(chuàng)建litepal.xml文件

圖中.dbname表示數(shù)據(jù)庫名稱? version? 表示版本
list 標(biāo)簽用來關(guān)聯(lián)數(shù)據(jù)庫表的實(shí)體類(注意必須使用全路徑)
如果有自己的ba'se'Application要在oncrate方法里面進(jìn)行初始化操作
LitePal.initialize(this);
Connector.getDatabase();//用于創(chuàng)建數(shù)據(jù)庫
操作實(shí)體類進(jìn)行增刪改查需要繼承DataSupport
保存 只需要調(diào)用save()方法就可以
更新有以下方式
1ContentValues?values?=?new?ContentValues();??
values.put("title",?"今日iPhone6發(fā)布");??
DataSupport.update(News.class,?values,?2);?這個靜態(tài)的update()方法接收三個參數(shù),第一個參數(shù)是Class,傳入我們要修改的那個類的Class就好,第二個參數(shù)是ContentValues對象,這三個參數(shù)是一個指定的id,表示我們要修改哪一行數(shù)據(jù)。
修改id為2的數(shù)據(jù)
2??updateAll()方法表示修改多行記錄,其中第一個參數(shù)仍然是Class,第二個參數(shù)還是ContentValues對象,第三個參數(shù)是一個conditions數(shù)組,用于指定修改哪些行的約束條件,返回值表示此次修改影響了多少行數(shù)據(jù)。
ContentValues?values?=?new?ContentValues();??
values.put("title",?"今日iPhone6?Plus發(fā)布");??
DataSupport.updateAll(News.class,?values,?"title?=??",?"今日iPhone6發(fā)布");
重點(diǎn)我們看一下最后的這個conditions數(shù)組,由于它的類型是一個String數(shù)組,我們可以在這里填入任意多個String參數(shù),其中最前面一個String參數(shù)用于指定約束條件,后面所有的String參數(shù)用于填充約束條件中的占位符(即?號),比如約束條件中有一個占位符,那么后面就應(yīng)該填寫一個參數(shù),如果有兩個占位符,后面就應(yīng)該填寫兩個參數(shù),以此類推
3也可以這樣子寫
News?updateNews?=?new?News();??
updateNews.setTitle("今日iPhone6發(fā)布");??
updateNews.update(2);?
4
那么如果我們想把news表中標(biāo)題為“今日iPhone6發(fā)布”且評論數(shù)量大于0的所有新聞的標(biāo)題改成“今日iPhone6 Plus發(fā)布”,就可以這樣寫:
News?updateNews?=?new?News();??
updateNews.setTitle("今日iPhone6發(fā)布");??
updateNews.updateAll("title?=???and?commentcount?>??",?"今日iPhone6發(fā)布",?"0");??
但是這種用法有一點(diǎn)需要注意,就是如果我們想把某一條數(shù)據(jù)修改成默認(rèn)值,比如說將評論數(shù)修改成0,只是調(diào)用updateNews.setCommentCount(0)這樣是不能修改成功的,因?yàn)榧词共徽{(diào)用這行代碼,commentCount的值也默認(rèn)是0。所以如果想要將某一列的數(shù)據(jù)修改成默認(rèn)值的話,還需要借助setToDefault()方法。用法也很簡單,在setToDefault()方法中傳入要修改的字段名就可以了(類中的字段名),比如說我們想要把news表中所有新聞的評論數(shù)清零,就可以這樣寫:
News?updateNews?=?new?News();??
updateNews.setToDefault("commentCount");??
updateNews.updateAll();??
刪除操作
delete()方法接收兩個參數(shù),第一個參數(shù)是Class,傳入我們要刪除的那個類的Class就好,第二個參數(shù)是一個指定的id,表示我們要刪除哪一行數(shù)據(jù)。
那么比如說我們想刪除news表中id為2的記錄,就可以這樣寫:
DataSupport.delete(News.class,?2);
deleteAll()方法接收兩個參數(shù),第一個參數(shù)是Class,傳入我們要刪除的那個類的Class就好,第二個參數(shù)是一個conditions數(shù)組,用于指定刪除哪些行的約束條件,返回值表示此次刪除了多少行數(shù)據(jù),用法和updateAll()方法是基本相同的。
而如果我們想把news表中所有的數(shù)據(jù)全部刪除掉,就可以這樣寫:
DataSupport.deleteAll(News.class);?
查詢操作
首先是調(diào)用了DataSupport的where()方法,在這里指定了查詢條件。where()方法接收任意個字符串參數(shù),其中第一個參數(shù)用于進(jìn)行條件約束,從第二個參數(shù)開始,都是用于替換第一個參數(shù)中的占位符的。那這個where()方法就對應(yīng)了一條SQL語句中的where部分。
List?newsList?=?DataSupport.select("title",?"content")??
.where("commentcount?>??",?"0")??
.order("publishdate?desc").find(News.class);??
order()方法中接收一個字符串參數(shù),用于指定查詢出的結(jié)果按照哪一列進(jìn)行排序,asc表示正序排序,desc表示倒序排序,因此order()方法對應(yīng)了一條SQL語句中的order by部分
篩選查詢 剛才我們查詢到的是所有匹配條件的前10條新聞,那么現(xiàn)在我想對新聞進(jìn)行分頁展示,翻到第二頁時,展示第11到第20條新聞,這又該怎么實(shí)現(xiàn)呢?沒關(guān)系,在LitePal的幫助下,這些功能都是十分簡單的,只需要再連綴一個偏移量就可以了,如下所示:
List?newsList?=?DataSupport.select("title",?"content")??
.where("commentcount?>??",?"0")??
.order("publishdate?desc").limit(10).offset(10)??
.find(News.class);??
可以看到,這里我們又添加了一個offset()方法,用于指定查詢結(jié)果的偏移量,這里指定成10,就表示偏移十個位置,那么原來是查詢前10條新聞的,偏移了十個位置之后,就變成了查詢第11到第20條新聞了,如果偏移量是20,那就表示查詢第21到第30條新聞,以此類推。因此,limit()方法和offset()方法共同對應(yīng)了一條SQL語句中的limit部分。
進(jìn)查詢的用法非常簡單,就只有這么多,其它find()方法也都是同樣的用法,就不再重復(fù)介紹了。但是這種查詢方式LitePal并不推薦,因?yàn)槿绻坏╆P(guān)聯(lián)表中的數(shù)據(jù)很多,查詢速度可能就會非常慢。而且激進(jìn)查詢只能查詢出指定表的關(guān)聯(lián)表數(shù)據(jù),但是沒法繼續(xù)迭代查詢關(guān)聯(lián)表的關(guān)聯(lián)表數(shù)據(jù)。因此,這里我建議大家還是使用默認(rèn)的懶加載更加合適,至于如何查詢出關(guān)聯(lián)表中的數(shù)據(jù),其實(shí)只需要在模型類中做一點(diǎn)小修改就可以了。
public?class?News?extends?DataSupport{??
public?List?getComments()?{??
return?DataSupport.where("news_id?=??",?String.valueOf(id)).find(Comment.class);??
????}??
}??