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