litepal
Android數(shù)據(jù)庫(kù)框架 - LitePal學(xué)習(xí)筆記
簡(jiǎn)述
LitePal是郭神(郭霖)在2014年的杰作,三年后在github上有了一個(gè)更新,故來(lái)學(xué)習(xí)一番,沒(méi)想到還挺好用,這里做下筆記。LitePal是一款開(kāi)源的Android數(shù)據(jù)庫(kù)框架,它采用了對(duì)象關(guān)系映射(ORM)的模式,并將我們平時(shí)開(kāi)發(fā)時(shí)最常用到的一些數(shù)據(jù)庫(kù)功能進(jìn)行了封裝,使得不用編寫(xiě)一行SQL語(yǔ)句就可以完成各種建表、増刪改查的操作。并且LitePal很“輕”,jar包只有100k不到,而且近乎零配置,這一點(diǎn)和hibernate這類的框架有很大區(qū)別。
github:https://github.com/LitePalFramework/LitePal
一、LitePal的基本用法
1. 引入Jar包或依賴
1)使用gradle依賴
dependencies {compile 'org.litepal.android:core:1.5.0' }2)導(dǎo)入jar包
①jar包:https://github.com/LitePalFramework/LitePal/raw/master/downloads/litepal-1.5.0.jar
②源碼包:https://github.com/LitePalFramework/LitePal/raw/master/downloads/litepal-1.5.0-src.jar
通過(guò)上述地址將jar包下載下來(lái)后復(fù)制到libs目錄下即可。
2. 配置litepal.xml
在assets目錄下創(chuàng)建一個(gè)litepal.xml文件,復(fù)制以下代碼進(jìn)去:
xml version="1.0" encoding="utf-8" <litepal> <dbname value="數(shù)據(jù)庫(kù)名" ></dbname> <span class="hljs-tag"><<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"數(shù)據(jù)庫(kù)版本號(hào),用于更新數(shù)據(jù)庫(kù)"</span> ></span><span class="hljs-tag"></<span class="hljs-name">version</span>></span> <span class="hljs-tag"><<span class="hljs-name">list</span>></span><span class="hljs-comment"><!--這里是類映射--></span> <span class="hljs-tag"></<span class="hljs-name">list</span>></span></litepal>
3. 配置LitePalApplication
1)如果你的項(xiàng)目中沒(méi)有自定義APP,則直接在清單文件中進(jìn)行如下配置:
<manifest> <application android:name="org.litepal.LitePalApplication" ... > ... </application> </manifest>2)如果你項(xiàng)目中有繼承Application的自定義APP:
①把 extends Application 換成 extends LitePalApplication.
②在清單文件中使用你自定義的APP,如自定義的APP為MyApplication:
<manifest> <application android:name="com.example.MyApplication" ... > ... </application> </manifest>3)如果你項(xiàng)目中的自定義APP是繼承了一個(gè)jar包中的第三方Application(即:源碼修改不了):
方案一:
方案二:
public class MyOwnApplication extends AnotherApplication { <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span><span class="hljs-params">()</span> </span>{<span class="hljs-keyword">super</span>.onCreate();LitePal.initialize(<span class="hljs-keyword">this</span>); } ...}
二、使用LitePal建表
例子:假設(shè)開(kāi)發(fā)的是一款新聞?lì)怉PP,本地需要一張新聞表記錄新聞,因?yàn)樵摽蚣苁荗RM框架,即需要一個(gè)新聞?lì)怤ews來(lái)表示新聞表,通過(guò)新聞?lì)悇?chuàng)建新聞表,只需要2步:
1、創(chuàng)建一個(gè)實(shí)體類
public class News { <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> id; <span class="hljs-keyword">private</span> String title; <span class="hljs-keyword">private</span> String content; <span class="hljs-keyword">private</span> Date publishDate; <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> commentCount; <span class="hljs-comment">// 自動(dòng)生成get、set方法 </span> ...}
2、修改assets目錄下的litepal.xml文件
xml version="1.0" encoding="utf-8" <litepal> <dbname value="demo" ></dbname> <span class="hljs-tag"><<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"1"</span> ></span><span class="hljs-tag"></<span class="hljs-name">version</span>></span> <span class="hljs-tag"><<span class="hljs-name">list</span>></span> <span class="hljs-tag"><<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>></span><span class="hljs-tag"></<span class="hljs-name">mapping</span>></span> <span class="hljs-tag"></<span class="hljs-name">list</span>></span></litepal>
三、使用LitePal升級(jí)表
升級(jí)表的場(chǎng)景有兩種:
① 增加表
② 修改表結(jié)構(gòu)
1、增加一張表
例子:對(duì)上述的新聞?lì)怉PP增加記錄評(píng)論的功能,那么就需要多一張?jiān)u論表,即多一個(gè)評(píng)論類Comment(這里不考慮表之間的關(guān)系,本次升級(jí)只是多增加一張表)。
1)、根據(jù)升級(jí)需求創(chuàng)建實(shí)體類
public class Comment { <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> id; <span class="hljs-keyword">private</span> String content; <span class="hljs-comment">// 自動(dòng)生成get、set方法 </span> ...}
2)、修改assets目錄下的litepal.xml文件
升級(jí)需要將version節(jié)點(diǎn)的value值+1。
xml version="1.0" encoding="utf-8" <litepal> <dbname value="demo" ></dbname> <span class="hljs-tag"><<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"2"</span> ></span><span class="hljs-tag"></<span class="hljs-name">version</span>></span> <span class="hljs-tag"><<span class="hljs-name">list</span>></span> <span class="hljs-tag"><<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>></span><span class="hljs-tag"></<span class="hljs-name">mapping</span>></span> <span class="hljs-tag"><<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Comment"</span>></span><span class="hljs-tag"></<span class="hljs-name">mapping</span>></span> <span class="hljs-tag"></<span class="hljs-name">list</span>></span></litepal>
2、修改之前的表結(jié)構(gòu)
例子:假設(shè)上述的評(píng)論類Comment是上個(gè)版本中少了一個(gè)表示發(fā)布時(shí)間的屬性publishDate,則在這次要發(fā)布的版本中需要加入。
1)、根據(jù)升級(jí)需求修改實(shí)體類
public class Comment { <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> id; <span class="hljs-keyword">private</span> String content; <span class="hljs-keyword">private</span> Date publishDate; <span class="hljs-comment">//多了一個(gè)表示發(fā)布時(shí)間的屬性</span><span class="hljs-comment">// 自動(dòng)生成get、set方法 </span> ...}
2)、修改assets目錄下的litepal.xml文件
<litepal> <dbname value="demo" ></dbname> <span class="hljs-tag"><<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"3"</span> ></span><span class="hljs-tag"></<span class="hljs-name">version</span>></span> ...</litepal>
四、使用LitePal建立表關(guān)聯(lián)
1、一對(duì)一:
例子:每篇新聞(類News)都對(duì)應(yīng)著一個(gè)簡(jiǎn)介(類Introduction),一個(gè)簡(jiǎn)介對(duì)應(yīng)著一篇新聞。
1)、在一個(gè)類中持有另一方的引用
①簡(jiǎn)介類
public class Introduction { <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> id; <span class="hljs-keyword">private</span> String guide; <span class="hljs-keyword">private</span> String digest; <span class="hljs-comment">// 自動(dòng)生成get、set方法 </span>}
②新聞?lì)?#xff08;持有簡(jiǎn)介類)
public class News { ... private Introduction introduction; //一篇新聞對(duì)應(yīng)著一個(gè)簡(jiǎn)介 <span class="hljs-comment">// 自動(dòng)生成get、set方法 </span>}
2)、修改litepal.xml中的版本號(hào),加入新表對(duì)就實(shí)體類的引用,更新數(shù)據(jù)庫(kù)。
xml version="1.0" encoding="utf-8" <litepal> <dbname value="demo" ></dbname> <span class="hljs-tag"><<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"4"</span> ></span><span class="hljs-tag"></<span class="hljs-name">version</span>></span> <span class="hljs-tag"><<span class="hljs-name">list</span>></span> <span class="hljs-tag"><<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>></span><span class="hljs-tag"></<span class="hljs-name">mapping</span>></span> <span class="hljs-tag"><<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Introduction"</span>></span><span class="hljs-tag"></<span class="hljs-name">mapping</span>></span> <span class="hljs-tag"></<span class="hljs-name">list</span>></span></litepal>
2、多對(duì)一:
例子:一篇新聞(類News)有多條評(píng)論(類Comment)
1)、在少的一方持有多的一方的集合,在多的一方持有少的一方的引用
①新聞?lì)?#xff08;少的一方)
public class News { ... private Introduction introduction; <span class="hljs-keyword">private</span> <span class="hljs-keyword">List</span><Comment> commentList = <span class="hljs-keyword">new</span> ArrayList<Comment>(); <span class="hljs-comment">//一篇新聞對(duì)應(yīng)多條評(píng)論 </span><span class="hljs-comment">// 自動(dòng)生成get、set方法 </span>}
②簡(jiǎn)介類(多的一方)
public class Comment { ... private News news; //一條評(píng)論對(duì)應(yīng)一篇新聞 <span class="hljs-comment">// 自動(dòng)生成get、set方法 </span>}
2)、修改litepal.xml中的版本號(hào),更新數(shù)據(jù)庫(kù)。
xml version="1.0" encoding="utf-8" <litepal> <dbname value="demo" ></dbname> <span class="hljs-tag"><<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"5"</span> ></span><span class="hljs-tag"></<span class="hljs-name">version</span>></span> <span class="hljs-tag"><<span class="hljs-name">list</span>></span> <span class="hljs-tag"><<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>></span><span class="hljs-tag"></<span class="hljs-name">mapping</span>></span> <span class="hljs-tag"><<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Introduction"</span>></span><span class="hljs-tag"></<span class="hljs-name">mapping</span>></span> <span class="hljs-tag"><<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Comment"</span>></span><span class="hljs-tag"></<span class="hljs-name">mapping</span>></span> <span class="hljs-tag"></<span class="hljs-name">list</span>></span></litepal>
3、多對(duì)多:
例子:一篇新聞(類News)對(duì)應(yīng)的多個(gè)類別(類Category),如iphone2000發(fā)布,可以是手機(jī)類、科技類,還可以是頭條。
1)、彼此持有對(duì)方的集合
①新聞?lì)?/p> public class News { ... private Introduction introduction; <span class="hljs-keyword">private</span> <span class="hljs-keyword">List</span><Comment> commentList = <span class="hljs-keyword">new</span> ArrayList<Comment>(); <span class="hljs-keyword">private</span> <span class="hljs-keyword">List</span><Category> categoryList = <span class="hljs-keyword">new</span> ArrayList<Category>(); <span class="hljs-comment">//一篇新聞對(duì)應(yīng)多種類別</span><span class="hljs-comment">// 自動(dòng)生成get、set方法 </span>
}
②類別類
public class Category { ... private List<News> newsList = new ArrayList<News>(); //一種類別對(duì)應(yīng)多篇新聞 <span class="hljs-comment">// 自動(dòng)生成get、set方法 </span>}
2)、修改litepal.xml中的版本號(hào),更新數(shù)據(jù)庫(kù)。
xml version="1.0" encoding="utf-8" <litepal> <dbname value="demo" ></dbname> <span class="hljs-tag"><<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"6"</span> ></span><span class="hljs-tag"></<span class="hljs-name">version</span>></span> <span class="hljs-tag"><<span class="hljs-name">list</span>></span> <span class="hljs-tag"><<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>></span><span class="hljs-tag"></<span class="hljs-name">mapping</span>></span> <span class="hljs-tag"><<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Comment"</span>></span><span class="hljs-tag"></<span class="hljs-name">mapping</span>></span> <span class="hljs-tag"><<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Introduction"</span>></span><span class="hljs-tag"></<span class="hljs-name">mapping</span>></span> <span class="hljs-tag"><<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Category"</span>></span><span class="hljs-tag"></<span class="hljs-name">mapping</span>></span> <span class="hljs-tag"></<span class="hljs-name">list</span>></span></litepal>
五、使用LitePal的存儲(chǔ)操作(增)
因?yàn)長(zhǎng)itePal可以通過(guò)一個(gè)普通的實(shí)體類把對(duì)應(yīng)的表創(chuàng)建出來(lái)或者對(duì)表升級(jí),所以沒(méi)有要求繼承指定的類或?qū)崿F(xiàn)指定的接口。但是,如果要對(duì)表進(jìn)行存儲(chǔ)操作,則就有一個(gè)要求了,那就是這些實(shí)體類必須繼承DataSupport。
1、讓實(shí)體類繼承DataSupport
public class News extends DataSupport{ ...... <span class="hljs-comment">// 自動(dòng)生成get、set方法 </span>}
2、使用save()對(duì)單個(gè)實(shí)體數(shù)據(jù)進(jìn)行保存
例子:對(duì)一篇新聞進(jìn)行保存
News news = new News(); news.setTitle("這是一條新聞標(biāo)題"); news.setContent("這是一條新聞內(nèi)容"); news.setPublishDate(new Date()); news.save();- tip:save()是不會(huì)拋出異常的,且返回的是boolean。
常規(guī)判斷數(shù)據(jù)是否保存成功的方式如下:
if (news.save()) { Toast.makeText(context, "存儲(chǔ)成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, "存儲(chǔ)失敗", Toast.LENGTH_SHORT).show(); }3、使用saveThrows()對(duì)單個(gè)實(shí)體數(shù)據(jù)進(jìn)行保存
例子:對(duì)一篇新聞進(jìn)行保存
News news = new News(); news.setTitle("這是一條新聞標(biāo)題"); news.setContent("這是一條新聞內(nèi)容"); news.setPublishDate(new Date()); news.saveThrows();- tip:saveThrows()是當(dāng)保存失敗時(shí)會(huì)拋出異常的,所以,可以通過(guò)對(duì)這個(gè)異常進(jìn)行捕獲來(lái)處理存儲(chǔ)失敗的情況。
3、使用DataSupport.saveAll()對(duì)多個(gè)實(shí)體數(shù)據(jù)進(jìn)行保存
List<News> newsList; ... DataSupport.saveAll(newsList);4、多對(duì)一的關(guān)系的數(shù)據(jù)保存
Comment comment1 = new Comment(); comment1.setContent("好評(píng)!"); comment1.setPublishDate(new Date()); comment1.save(); //保存了第一條評(píng)論 Comment comment2 = new Comment(); comment2.setContent("贊一個(gè)"); comment2.setPublishDate(new Date()); comment2.save(); //保存了第二條評(píng)論 News news = new News(); news.getCommentList().add(comment1); news.getCommentList().add(comment2); //把前兩條保存過(guò)的評(píng)論添加到News對(duì)象的評(píng)論集合中 news.setTitle("第二條新聞標(biāo)題"); news.setContent("第二條新聞內(nèi)容"); news.setPublishDate(new Date()); news.setCommentCount(news.getCommentList().size()); news.save(); //保存News對(duì)象5、使用saveAsync()對(duì)單個(gè)數(shù)據(jù)進(jìn)行異步保存
News news = new News(); news.setTitle("這是一條新聞標(biāo)題"); news.setContent("這是一條新聞內(nèi)容"); news.setPublishDate(new Date()); news.saveAsync().listen(new SaveCallback() {public void onFinish(boolean success) { }});
6、當(dāng)數(shù)據(jù)保存成功時(shí),對(duì)象中的id會(huì)被賦值
當(dāng)調(diào)用save()方法或saveThrows()方法存儲(chǔ)成功之后,LitePal會(huì)自動(dòng)將該條數(shù)據(jù)對(duì)應(yīng)的id賦值到實(shí)體類的id字段上。
以下做個(gè)實(shí)驗(yàn):
打印結(jié)果如下:
news id is 0 news id is 1六、使用LitePal的修改和刪除操作(刪改)
使用LitePal的修改和刪除操作分別有兩種方式:
- ①使用DataSupport類中的靜態(tài)方法(即實(shí)體類不需要繼承DataSupport)。
- ②使用繼承了DataSupport的實(shí)體類中的方法。
*tip:方式①中必須使用ContentValues類,而方式②不用。
1、修改操作
1)修改指定id的數(shù)據(jù)
①使用DataSupport類中的update()靜態(tài)方法:
DataSupport.update(實(shí)體類.class,ContentValues,id值)
ContentValues values = new ContentValues(); values.put("title", "今日iPhone6發(fā)布"); DataSupport.update(News.class, values, 2);②使用繼承了DataSupport的實(shí)體類中的方法:
obj.update(id值)
News updateNews = new News(); //News必須繼承DataSupport updateNews.setTitle("今日iPhone6發(fā)布"); updateNews.update(2);2)修改指定條件的數(shù)據(jù)
①使用DataSupport類中的updateAll()靜態(tài)方法:
DataSupport.updateAll(實(shí)體類.class,ContentValues,條件組)
ContentValues values = new ContentValues(); values.put("title", "今日iPhone6 Plus發(fā)布"); DataSupport.updateAll(News.class, values, "title = ? and commentcount > ?", "今日iPhone6發(fā)布", "0");②使用繼承了DataSupport的實(shí)體類中的方法:
obj.updateAll(條件組)
News updateNews = new News(); //News必須繼承DataSupport updateNews.setTitle("今日iPhone6發(fā)布"); updateNews.updateAll("title = ? and commentcount > ?", "今日iPhone6發(fā)布", "0");3)修改全表數(shù)據(jù)
DataSupport.updateAll(實(shí)體類.class,ContentValues)
例子:把news表中所有新聞的標(biāo)題都改成“今日iPhone6發(fā)布”。
ContentValues values = new ContentValues(); values.put("title", "今日iPhone6 Plus發(fā)布"); DataSupport.updateAll(News.class, values);4)將對(duì)應(yīng)字段修改為默認(rèn)值
obj.setToDefault("字段名")
該方法是針對(duì)繼承了DataSupport的實(shí)體類來(lái)說(shuō)的!!!
News updateNews = new News(); //News必須繼承DataSupport updateNews.setToDefault("commentCount"); updateNews.updateAll();2、刪除操作
*刪除操作的有幾個(gè)地方需要注意:
- 只能刪除持久化過(guò)的數(shù)據(jù),所謂持久化過(guò)的數(shù)據(jù),通俗的說(shuō)就是保存過(guò)的數(shù)據(jù),也就是保存或查詢出來(lái)的數(shù)據(jù)才能被刪除。
- 如果刪除的數(shù)據(jù)id是另一張表中的外鍵,則在刪除該數(shù)據(jù)時(shí),別一張表中的關(guān)聯(lián)數(shù)據(jù)也會(huì)被刪除。
- 繼承了DataSupport的實(shí)體類沒(méi)有deleteAll方法,所以只有一種刪除指定條件的數(shù)據(jù)方式(即:DataSupport.deleteAll())。
- 最后切記,多條件時(shí)只能用單詞and連接條件,不能用符號(hào)&!!!
1)刪除指定id的數(shù)據(jù)
①使用DataSupport類中的delete()靜態(tài)方法:
DataSupport.delete(實(shí)體類.class,id值)
DataSupport.delete(News.class, 2);②使用繼承了DataSupport的實(shí)體類中的方法:
obj.delete(id值)
這里new出了一個(gè)News對(duì)象,這個(gè)對(duì)象明顯是沒(méi)有持久化的,此時(shí)調(diào)用delete()方法則不會(huì)刪除任何數(shù)據(jù)。
News news = new News(); news.delete();如果我們之前將這個(gè)對(duì)象持久化過(guò)了,那么調(diào)用delete()方法就會(huì)把這個(gè)對(duì)象對(duì)應(yīng)的數(shù)據(jù)刪除掉了。
News news = new News(); news.setTitle("這是一條新聞標(biāo)題"); news.setContent("這是一條新聞內(nèi)容"); news.save(); ... news.delete();可以使用DataSupport中的isSaved()方法,判斷對(duì)象是否持久化。
News news; ... if (news.isSaved()) { news.delete(); }2)刪除指定條件的數(shù)據(jù)
DataSupport.deleteAll(實(shí)體類.class,條件組)
DataSupport.deleteAll(News.class, "title = ? and commentcount = ?", "今日iPhone6發(fā)布", "0");3)刪除全表數(shù)據(jù)
DataSupport.deleteAll(實(shí)體類.class)
DataSupport.deleteAll(News.class);七、使用LitePal的查詢(查)
1、簡(jiǎn)單查詢
1)查詢單條數(shù)據(jù)
①查詢指定id數(shù)據(jù)
News news = DataSupport.find(News.class, 1);②查詢第一條數(shù)據(jù)
News firstNews = DataSupport.findFirst(News.class);③查詢最后一條數(shù)據(jù)
News lastNews = DataSupport.findLast(News.class);2)查詢多條數(shù)據(jù)
①查詢指定多個(gè)id數(shù)據(jù)
//方式一: List<News> newsList = DataSupport.findAll(News.class, 1, 3, 5, 7);//方式二:
long[] ids = new long[] { 1, 3, 5, 7 };
List<News> newsList = DataSupport.findAll(News.class, ids);
②查詢表中所有數(shù)據(jù)
List<News> allNews = DataSupport.findAll(News.class);2、連綴查詢
例子:查詢 新聞表 中 評(píng)論數(shù)大于0 的 第11到20條 數(shù)據(jù),以 發(fā)布時(shí)間倒序 排序方式呈現(xiàn),只取 “標(biāo)題”和“內(nèi)容” 兩列內(nèi)容。
一般的sql語(yǔ)句如下:
select title,content from news where commentcount > 0 order by publishdate desc limit 10,10;使用LitePal的連綴查詢,代碼如下:
List<News> newsList = DataSupport.select("title", "content").where("commentcount > ?", "0").order("publishdate desc").offset(10).limit(10).find(News.class);*tip:其中select、where、order、offset、limit可以任意放置位置,可以根據(jù)自己的需求任意刪減,但find不能去掉。
3、激進(jìn)查詢
LitePal的默認(rèn)查詢是懶查詢,即:只能查詢單表中的數(shù)據(jù),關(guān)聯(lián)表中的數(shù)據(jù)無(wú)法查到。
1)如何使用激進(jìn)查詢
如果需要將關(guān)聯(lián)表中的數(shù)據(jù)一起查出(激進(jìn)查詢),可以將find()方法的最后一個(gè)參數(shù)(boolean isEager)設(shè)置為true即可,如:
News news = DataSupport.find(News.class, 1, true); List<Comment> commentList = news.getCommentList();2)激進(jìn)查詢的缺點(diǎn):
- 一旦關(guān)聯(lián)表中的數(shù)據(jù)很多,查詢速度可能就會(huì)非常慢。
- 激進(jìn)查詢只能查詢出指定表的關(guān)聯(lián)表數(shù)據(jù),但是沒(méi)法繼續(xù)迭代查詢關(guān)聯(lián)表的關(guān)聯(lián)表數(shù)據(jù)。
3)使用懶查詢代替激進(jìn)查詢
激進(jìn)查詢不被LitePal推薦,推薦使用懶查詢,如果要使用懶查詢,可以對(duì)實(shí)體類做如下修改,以做到關(guān)聯(lián)表查詢:
public class News extends DataSupport{ ... public List<Comment> getComments() { return DataSupport.where("news_id = ?", String.valueOf(id)).find(Comment.class); } }*tip:只有該getComments()方法被調(diào)用的時(shí)候,才會(huì)去查詢關(guān)聯(lián)數(shù)據(jù)。這種寫(xiě)法會(huì)比激進(jìn)查詢更加高效也更加合理。
4、原生查詢
DataSupport.findBySQL(條件組);
Cursor cursor = DataSupport.findBySQL("select * from news where commentcount>?", "0");八、使用LitePal的聚合函數(shù)
LitePal中一共提供了count()、sum()、average()、max()和min()這五種聚合函數(shù)
1、count()
count()方法主要是用于統(tǒng)計(jì)行數(shù)的
DataSupport.count(實(shí)體類.class)
例子:統(tǒng)計(jì)news表中一共有多少行
int result = DataSupport.count(News.class); //使用連綴查詢,增加查詢條件 int result = DataSupport.where("commentcount = ?", "0").count(News.class);2、sum()
sum()方法主要是用于對(duì)結(jié)果進(jìn)行求合的
DataSupport.sum(實(shí)體類.class, "要求合的字段", 結(jié)果類型)
例子:統(tǒng)計(jì)news表中評(píng)論的總數(shù)量
int result = DataSupport.sum(News.class, "commentcount", int.class); // 也可以是float、double*tip:如果要求合的字段是非法的,如String,則返回結(jié)果是0。
3、average()
average()方法主要是用于統(tǒng)計(jì)平均數(shù)的
DataSupport.average(實(shí)體類.class, "要求平均數(shù)的字段")
例子:統(tǒng)計(jì)news表中平均每條新聞?dòng)卸嗌僭u(píng)論
double result = DataSupport.average(News.class, "commentcount"); //默認(rèn)返回值就是double,因?yàn)榍笃骄鶖?shù)大多時(shí)候都會(huì)有小數(shù),//使用double可以最大程序保留小數(shù)位的精度。*tip:如果要求平均數(shù)的字段是非法的,如String,則返回結(jié)果是0。
4、max()
max()方法主要用于求出某個(gè)列中最大的數(shù)值
DataSupport.max(實(shí)體類.class, "要求最大值的字段", 結(jié)果類型)
例子:news表中所有新聞里面最高的評(píng)論數(shù)是多少
int result = DataSupport.max(News.class, "commentcount", int.class);5、min()
min()方法主要用于求出某個(gè)列中最小的數(shù)值
DataSupport.min(實(shí)體類.class, "要求最小值的字段", 結(jié)果類型)
例子:news表中所有新聞里面最少的評(píng)論數(shù)是多少
int result = DataSupport.min(News.class, "commentcount", int.class);九、使用注解對(duì)字段進(jìn)行約束
使用注解@Column可以對(duì)字段進(jìn)行約束,共有4種如下約束:
(unique = true) //是否唯一 (defaultValue = "unknown") //指定字段默認(rèn)值 (nullable = false) //是否可以為空 (ignore = true) //是否可以忽略例子:一張新聞表,主鍵唯一,標(biāo)題不能為空,內(nèi)容有默認(rèn)值。
public class News extends DataSupport { <span class="hljs-meta">@Column</span>(unique = <span class="hljs-keyword">true</span>) <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> id; <span class="hljs-meta">@Column</span>(nullable = <span class="hljs-keyword">false</span>) <span class="hljs-keyword">private</span> String title; <span class="hljs-meta">@Column</span>(defaultValue = <span class="hljs-string">"我是內(nèi)容"</span>) <span class="hljs-keyword">private</span> String content; <span class="hljs-keyword">private</span> Date publishDate; <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> commentCount; <span class="hljs-comment">// 自動(dòng)生成get、set方法 </span> ...}
十、對(duì)多個(gè)數(shù)據(jù)庫(kù)的支持
如果項(xiàng)目中用到了多個(gè)數(shù)據(jù)庫(kù),LitePal也可以支持,在程序運(yùn)行的時(shí)候可以創(chuàng)建多個(gè)數(shù)據(jù)庫(kù)。:
1、創(chuàng)建一個(gè)全新的數(shù)據(jù)庫(kù)
LitePalDB litePalDB = new LitePalDB("db2", 1); //創(chuàng)建一個(gè)名為"db2"的第二個(gè)數(shù)據(jù)庫(kù) litePalDB.addClassName(Singer.class.getName()); //將實(shí)體類Singer等與db2進(jìn)行關(guān)聯(lián) litePalDB.addClassName(Album.class.getName()); litePalDB.addClassName(Song.class.getName()); LitePal.use(litePalDB); //使用db2數(shù)據(jù)庫(kù)2、創(chuàng)建一個(gè)結(jié)構(gòu)跟舊數(shù)據(jù)庫(kù)一樣的數(shù)據(jù)庫(kù)
結(jié)構(gòu)跟舊數(shù)據(jù)庫(kù)一樣的意思是:litepal.xml配置一樣。
LitePalDB litePalDB = LitePalDB.fromDefault("新數(shù)據(jù)庫(kù)名"); LitePal.use(litePalDB);3、換回默認(rèn)數(shù)據(jù)庫(kù)(原來(lái)舊的數(shù)據(jù)庫(kù))
LitePal.useDefault();4、刪除任意數(shù)據(jù)庫(kù)
LitePal.deleteDatabase("數(shù)據(jù)庫(kù)名"); </div></div>總結(jié)
- 上一篇: Aspose.Java实现word转pd
- 下一篇: 解决torch.cuda.is_avai