日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

litepal

發(fā)布時(shí)間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 litepal 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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">&lt;<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> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">list</span>&gt;</span><span class="hljs-comment">&lt;!--這里是類映射--&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">list</span>&gt;</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(即:源碼修改不了):

方案一:

  • 你可以把LitePal的源碼下載下來(lái),然后把src目錄下的所有代碼直接拷貝到你項(xiàng)目的src目錄下面
  • 接著打開(kāi)LitePalApplication類,將它的繼承結(jié)構(gòu)改成繼承自第三方Application
  • 再讓MyApplication繼承自LitePalApplication,這樣所有的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">&lt;<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"1"</span> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">list</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">list</span>&gt;</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">&lt;<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"2"</span> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">list</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Comment"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">list</span>&gt;</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">&lt;<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"3"</span> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</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">&lt;<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"4"</span> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">list</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Introduction"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">list</span>&gt;</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>&lt;Comment&gt; commentList = <span class="hljs-keyword">new</span> ArrayList&lt;Comment&gt;(); <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">&lt;<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"5"</span> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">list</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Introduction"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Comment"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">list</span>&gt;</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>&lt;Comment&gt; commentList = <span class="hljs-keyword">new</span> ArrayList&lt;Comment&gt;(); <span class="hljs-keyword">private</span> <span class="hljs-keyword">List</span>&lt;Category&gt; categoryList = <span class="hljs-keyword">new</span> ArrayList&lt;Category&gt;(); <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">&lt;<span class="hljs-name">version</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"6"</span> &gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">list</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.News"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Comment"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Introduction"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">mapping</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.example.databasetest.model.Category"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mapping</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">list</span>&gt;</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() {@Overridepublic 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):

    News news = new News(); news.setTitle("這是一條新聞標(biāo)題"); news.setContent("這是一條新聞內(nèi)容"); news.setPublishDate(new Date()); Log.d("TAG", "news id is " + news.getId()); news.save(); Log.d("TAG", "news id is " + news.getId());

    打印結(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種如下約束:

    @Column(unique = true) //是否唯一 @Column(defaultValue = "unknown") //指定字段默認(rèn)值 @Column(nullable = false) //是否可以為空 @Column(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é)

    以上是生活随笔為你收集整理的litepal的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。