多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > Android數據庫高手秘籍(六)――LitePal的修改和刪除操作

Android數據庫高手秘籍(六)――LitePal的修改和刪除操作

來源:程序員人生   發布時間:2014-11-13 08:42:22 閱讀次數:7754次

轉載請注明出處:http://blog.csdn.net/guolin_blog/article/details/40083685

在上1篇文章中,我們學會了使用LitePal進行存儲數據的功能。確切,比起直接使用Android原生的API,LitePal明顯簡單方便了太多。那末,在增刪改查4種操作中,我們已把“增”學完了,今天就讓我們繼續趁熱打鐵,學習1下如何使用LitePal進行修改和刪除操作。還沒有看過前1篇文章的朋友建議先去參考 Androidhttp://www.vxbq.cn/db/高手秘籍(5)――LitePal的存儲操作

LitePal的項目地址是:https://github.com/LitePalFramework/LitePal

傳統的修改和刪除數據方式

上篇文章中我們已得知,SQLiteDatabase類中提供了1個insert()方法用于插入數據,那末類似地,它還提供了update()和delete()這兩個方法,分別用于修改和刪除數據。先來看1下update()方法的方法定義:

public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
update()方法接收4個參數,第1個參數是表名,第2個參數是1個封裝了待修改數據的ContentValues對象,第3和第4個參數用于指定修改哪些行,對應了SQL語句中的where部份。

那末比如說我們想把news表中id為2的記錄的標題改成“本日iPhone6發布”,就能夠這樣寫:

SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("title", "本日iPhone6發布"); db.update("news", values, "id = ?", new String[] {"2"});

其作用相當于以下SQL語句:

update news set title='本日iPhone6發布' where id=2;
可以看出,比起直接使用SQL語句,update()方法的語義性明顯更強,也更容易讓人理解。

接下來再看1下delete()方法的方法定義:

public int delete(String table, String whereClause, String[] whereArgs)
delete()方法接收3個參數,第1個參數一樣是表名,第2和第3個參數用于指定刪除哪些行,對應了SQL語句中的where部份。

那末比如說我們想把news表中所有無評論的新聞都刪除掉,就能夠這樣寫:

SQLiteDatabase db = dbHelper.getWritableDatabase(); db.delete("news", "commentcount = ?", new String[] {"0"});
其作用相當于以下SQL語句:
delete from news where commentcount=0;

因而可知,Android給我們提供的這些幫助方法,在很大程度上確切簡化了很多http://www.vxbq.cn/db/操作的復雜度。不過LitePal明顯做到了更好,下面就讓我們學習1下如何使用LitePal來進行修改和刪除操作。

使用LitePal修改數據

LitePal修改數據的API比較簡單,并沒有甚么太多的用法,也比較好理解,方法都是定義在DataSupport類中的,我們先來看1下方法定義:

public static int update(Class<?> modelClass, ContentValues values, long id)
這個靜態的update()方法接收3個參數,第1個參數是Class,傳入我們要修改的那個類的Class就好,第2個參數是ContentValues對象,這3個參數是1個指定的id,表示我們要修改哪1行數據。

那末比如說我們想把news表中id為2的記錄的標題改成“本日iPhone6發布”,就能夠這樣寫:

ContentValues values = new ContentValues(); values.put("title", "本日iPhone6發布"); DataSupport.update(News.class, values, 2);
可以看出,整體來說還是比原生的用法要簡單1些的,首先我們避免掉了要去獲得SQLiteDatabase對象的步驟,其次在指定修改某1條id記錄的時候只需要傳入這個id便可,語法更簡練。

那末有的朋友可能會問了,或許我想修改的是某1個條件下的所有數據,而不是僅僅修改某個id的數據,那該怎樣辦呢?別擔心,LitePal還提供了另外1個簡便的方法,方法定義以下:

public static int updateAll(Class<?> modelClass, ContentValues values, String... conditions)
updateAll()方法表示修改多行記錄,其中第1個參數依然是Class,第2個參數還是ContentValues對象,第3個參數是1個conditions數組,用于指定修改哪些行的束縛條件,返回值表示此次修改影響了多少行數據。

那末比如說我們想把news表中標題為“本日iPhone6發布”的所有新聞的標題改成“本日iPhone6 Plus發布”,就能夠這樣寫:

ContentValues values = new ContentValues(); values.put("title", "本日iPhone6 Plus發布"); DataSupport.updateAll(News.class, values, "title = ?", "本日iPhone6發布");
前面都沒甚么好說的,重點我們看1下最后的這個conditions數組,由于它的類型是1個String數組,我們可以在這里填入任意多個String參數,其中最前面1個String參數用于指定束縛條件,后面所有的String參數用于填充束縛條件中的占位符(即?號),比如束縛條件中有1個占位符,那末后面就應當填寫1個參數,如果有兩個占位符,后面就應當填寫兩個參數,以此類推。

比如說我們想把news表中標題為“本日iPhone6發布”且評論數量大于0的所有新聞的標題改成“本日iPhone6 Plus發布”,就能夠這樣寫:

ContentValues values = new ContentValues(); values.put("title", "本日iPhone6 Plus發布"); DataSupport.updateAll(News.class, values, "title = ? and commentcount > ?", "本日iPhone6發布", "0");
可以看出,通過占位符的方式來實現條件束縛明顯要比原生的API更加簡單易用。

那末如果我們想把news表中所有新聞的標題都改成“本日iPhone6發布”,該怎樣寫呢?其實這就更簡單了,只需要把最后的束縛條件去掉就好了,以下所示:

ContentValues values = new ContentValues(); values.put("title", "本日iPhone6 Plus發布"); DataSupport.updateAll(News.class, values);
怎樣樣,這類寫法是否是感覺語義性非常強?updateAll()方法在不指定束縛條件的情況下就是修改所有行的數據,的的確確是update all了。

固然有些朋友可能會覺得這樣用起來還是有點復雜,由于這個ContentValues對象很煩人,每次創建它的時候都要寫很多繁瑣的代碼。沒關系,LitePal也充分斟酌了這類情況,提供了1種不需要ContentValues就可以修改數據的方法,下面我們嘗試使用這類新方法來完成上述一樣的功能。

比如把news表中id為2的記錄的標題改成“本日iPhone6發布”,就能夠這樣寫:

News updateNews = new News(); updateNews.setTitle("本日iPhone6發布"); updateNews.update(2);
這次我們并沒有用ContentValues,而是new出了1個News對象,把要修改的數據直接set進去,最后調用1下update()方法并傳入id就能夠了。不但不用創建ContentValues對象,連表名都不用指定了,由于News對象默許就是修改的news表。

這是其中1種用法,那末如果我們想把news表中標題為“本日iPhone6發布”且評論數量大于0的所有新聞的標題改成“本日iPhone6 Plus發布”,就能夠這樣寫:

News updateNews = new News(); updateNews.setTitle("本日iPhone6發布"); updateNews.updateAll("title = ? and commentcount > ?", "本日iPhone6發布", "0");
還是非常好理解的,這里我就不再詳細解釋了。

但是這類用法有1點需要注意,就是如果我們想把某1條數據修改成默許值,比如說將評論數修改成0,只是調用updateNews.setCommentCount(0)這樣是不能修改成功的,由于即便不調用這行代碼,commentCount的值也默許是0。所以如果想要將某1列的數據修改成默許值的話,還需要借助setToDefault()方法。用法也很簡單,在setToDefault()方法中傳入要修改的字段名就能夠了(類中的字段名),比如說我們想要把news表中所有新聞的評論數清零,就能夠這樣寫:

News updateNews = new News(); updateNews.setToDefault("commentCount"); updateNews.updateAll();

使用LitePal刪除數據

LitePal刪除數據的API和修改數據是比較類似的,但是更加的簡單1些,我們先來看1下DataSupport類中的方法定義,以下所示:

public static int delete(Class<?> modelClass, long id)
delete()方法接收兩個參數,第1個參數是Class,傳入我們要刪除的那個類的Class就好,第2個參數是1個指定的id,表示我們要刪除哪1行數據。

那末比如說我們想刪除news表中id為2的記錄,就能夠這樣寫:

DataSupport.delete(News.class, 2);

需要注意的是,這不單單會將news表中id為2的記錄刪除,同時還會將其它表中以news id為2的這條記錄作為外鍵的數據1起刪除掉,由于外鍵既然不存在了,那末這么數據也就沒有保存的意義了。

說起來可能有點拗口,我們還是舉例看1下。比如news表中目前有兩條數據,以下圖所示:


然后comment表中也有兩條數據,以下圖所示:


其中comment表中兩條數據的外鍵都是2,指向的news表中id為2的這條記錄。那末下面我們履行以下刪除語句:

int deleteCount = DataSupport.delete(News.class, 2); Log.d("TAG", "delete count is " + deleteCount);
其中delete()方法的返回值表示被刪除的記錄數,打印結果以下所示:


可以看到,有3條記錄被刪除,那我們再到news表中查詢1下:


OK,只剩下1條記錄了,id為2的那條記錄確切被刪除。那末再到comment表中看1下呢,以下圖所示:


數據全沒了!為何呢?由于comment表中的兩條數據都是以news表中id為2的數據作為外鍵的,現在外鍵不存在了,那末這兩條數據自然也沒有存在的意義了,因此被刪除的記錄數1共是3條。這樣是否是就好理解了很多呢?

除刪除指定id的數據以外,DataSupport中也提供了1個通過where語句來批量刪除數據的方法,先看1下方法定義:

public static int deleteAll(Class<?> modelClass, String... conditions)
看起來很眼熟吧?非常簡單,deleteAll()方法接收兩個參數,第1個參數是Class,傳入我們要刪除的那個類的Class就好,第2個參數是1個conditions數組,用于指定刪除哪些行的束縛條件,返回值表示此次刪除多少行數據,用法和updateAll()方法是基本相同的。

那末比如說我們想把news表中標題為“本日iPhone6發布”且評論數等于0的所有新聞都刪除掉,就能夠這樣寫:

DataSupport.deleteAll(News.class, "title = ? and commentcount = ?", "本日iPhone6發布", "0");
而如果我們想把news表中所有的數據全部刪除掉,就能夠這樣寫:
DataSupport.deleteAll(News.class);
在不指定束縛條件的情況下,deleteAll()方法就會刪除表中所有的數據了。

除DataSupport類中提供的靜態刪除方法以外,還有1個刪除方法是作用于對象上的,即任何1個繼承自DataSupport類的實例都可以通過調用delete()這個實例方法來刪除數據。但條件是這個對象1定是要持久化以后的,1個非持久化的對象如果調用了delete()方法則不會產生任何效果。

比如說下面這類寫法:

News news = new News(); news.delete();
這里new出了1個News對象,這個對象明顯是沒有持久化的,那末此時調用delete()方法則不會刪除任何數據。

但如果我們之前將這個對象持久化過了,那末再調用delete()方法就會把這個對象對應的數據刪除掉了,比如:

News news = new News(); news.setTitle("這是1條新聞標題"); news.setContent("這是1條新聞內容"); news.save(); ... news.delete();
1個對象如果save過了以后,那就是持久化的了。除調用save()方法以外,通過DataSupport中提供的查詢方法從http://www.vxbq.cn/db/中查出來的對象也是經過持久化的,查詢的功能我們會在下篇博客中講授。

另外還有1個簡單的辦法可以幫助我們判斷1個對象是不是是持久化以后的,DataSupport類中提供了1個isSaved()方法,這個方法返回true就表示該對象是經過持久化的,返回false則表示該對象未經過持久化。那末刪除1個對象對應的數據也就能夠這樣寫了:

News news; ... if (news.isSaved()) { news.delete(); }

好了,這樣我們就把LitePal中提供的修改和刪除數據操作的用法基本都學習完了,那末今天的文章就到這里,下1篇文章中會開始講授查詢數據的用法。

LitePal開源項目地址:https://github.com/LitePalFramework/LitePal

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 久久国产成人福利播放 | 亚洲精品综合一区二区 | 免费在线播放视频 | 亚洲成人在线免费 | 亚洲精品视频久久久 | 91久久精品一区二区三区 | 国产亚洲综合成人91精品 | 午夜视频免费在线播放 | 91sao国产在线观看 | 精品一区精品二区 | 欧美国产成人精品一区二区三区 | japanese18日本护士 | 自拍偷拍网站 | 国产麻豆视频在线观看 | 欧美性猛交aa一级 | 久久艹免费视频 | 欧美不卡一区二区三区免 | 亚洲人成在线观看男人自拍 | 精彩视频在线观看 | 免费国产精成人品 | 最近高清中文在线字幕在线观看 | 欧美艳星xxx | 欧美精品超清在线播放 | 视频自拍网 | 日本不卡专区 | 国产成人亚洲精品无广告 | 亚洲欧美日韩精品一区 | 国产69精品久久久久999 | 手机免费在线视频 | 亚洲综合国产精品 | 日本自己的私人影院 | yellow网站在线观看 | 午夜欧美精品久久久久久久久 | 国产午夜精品免费一二区 | 手机在线精品视频每日更新 | 中文字幕网站在线 | 日韩精品一区二区三区视频 | 亚洲国产欧美在线人网站 | 97在线视频99播放 | 亚洲福利社| 一个色综合网 |