Android資料庫高手秘籍(五)——LitePal的儲存操作

來源:互聯網
上載者:User

標籤:

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

經過前面幾篇文章的學習,我們已經把LitePal的表管理模組的功能都非常好地掌握了,相信大家都已經體會到了使用LitePal來建立表、升級表、以及建立表關聯所帶來的便利。那麼從本篇文章開始,我們將進入到一個新模組的學習旅程其中,使用LitePal來進行表的CRUD操作。還沒有看過前一篇文章的朋友建議先去參考 Android資料庫高手秘籍(四)——使用LitePal建立表關聯

LitePal提供的CRUD操作的API還是頗為豐富的,一篇文章肯定是介紹不全的。因此這裡我們仍然是分幾篇文章進行解說,本篇主要是介紹儲存方面的API。

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

傳統的儲存資料方式

事實上最傳統的儲存資料方式肯定是通過SQL語句拼接字串來進行儲存的,只是這樣的方式有點過於“傳統”了。今天我們在這裡就不討論這樣的情況。

實際上,Android專門提供了一種用於儲存資料的簡便方法,使得我們不用編寫SQL語句就能夠運行儲存操作。以下來看一下SQLiteDatabase中的insert()方法:

public long insert(String table, String nullColumnHack, ContentValues values)
能夠看到。insert方法接收三個參數,第一個參數是表名,第二個參數通常都用不到,直接傳null,第三個參數則是一個封裝了待儲存資料的ContentValues對象。因此,比方說我們想往news表中插入一條新聞,就能夠這樣寫:
SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("title", "這是一條新聞標題");values.put("content", "這是一條新聞內容");values.put("publishdate", System.currentTimeMillis());long id = db.insert("news", null, values);
其中,調用ContentValues的put()方法來加入待儲存資料,put()方法接收兩個參數,第一個參數是資料庫表中相應的列名,第二個參數就是要儲存的值,最後調用一下insert()方法。這條新聞就會插入到news表其中了,而且該資料行相應的id會作為傳回值進行返回。

使用方法非常easy是嗎?確實,比起直接使用SQL語句,SQLiteDatabase中提供的insert()方法的確簡單了非常多。但insert()方法也並不是是那麼的完美,它還是有非常多不方便的地方的,比方說沒有考慮表關聯的情況,我們須要手動對關聯表的外鍵進行儲存。

再比方說,沒有提供批量儲存的功能,當我們有一個集合的資料須要儲存時。須要通過迴圈來遍曆這個集合。然後一次次地調用insert()方法來插入資料。

好了。那麼關於傳統儲存資料的使用方法就簡介到這裡,由於確實沒什麼的很多其它的使用方法了,而且它也不是我們今天的主角。接下來。就讓我們看一看今天的驚喜,學習如何使用LitePal來進行資料庫儲存的操作。

使用LitePal儲存資料

LitePal中與儲存相關的API事實上並不多。但使用方法還是頗為豐富的。而且比起傳統的insert()方法。使用LitePal來儲存資料能夠簡單到讓你驚歎的地步,那麼今天我們就來完整地學習一下LitePal儲存資料的全部使用方法。

在前面幾篇文章其中,我們在項目裡已經建好了News、Comment、Introduction、Category這幾個實體類,通過這些實體類,LitePal就能夠把相應的表自己主動建立出來。

如今來觀察這幾個實體類。我們發現這幾個類都是沒有繼承結構的。沒錯,由於LitePal進行表管理操作時不須要這些實體類有不論什麼的繼承結構,當時為了簡單起見就沒有寫。可是進行CRUD操作時就不行了。LitePal要求全部的實體類都要繼承自DataSupport這個類。因此這裡我們就要把繼承結構給加上才行。改動News類的代碼。例如以下所看到的:

public class News extends DataSupport{......// 自己主動產生get、set方法}
能夠看到,這裡僅僅是讓News類繼承自了DataSupport,其它什麼都沒有改變。

另外幾個Comment、Introduction、Category類也使用相同的改法,這裡就不一一示範了。

繼承了DataSupport類之後,這些實體類就擁有了進行CRUD操作的能力,那麼比方想要儲存一條資料到news表其中,就能夠這樣寫:

News news = new News();news.setTitle("這是一條新聞標題");news.setContent("這是一條新聞內容");news.setPublishDate(new Date());news.save();
怎麼樣?是不是非常easy,不須要SQLiteDatabase。不須要ContentValues,不須要通過列名組裝資料。甚至不須要指定表名,僅僅須要new出一個News對象。然後把要儲存的資料通過setter方法傳入,最後調用一下save()方法就好了。而這個save()方法自然就是從DataSupport類中繼承而來的了。

除此之外。save()方法還是有傳回值的。我們能夠依據傳回值來推斷儲存是否成功。比方說這樣寫:

if (news.save()) {Toast.makeText(context, "儲存成功", Toast.LENGTH_SHORT).show();} else {Toast.makeText(context, "儲存失敗", Toast.LENGTH_SHORT).show();}
能夠看出,save()方法返回的是一個布爾值,用於表示儲存成功還是失敗,但同一時候也說明這種方法是不會拋出異常的。

有些朋友希望假設儲存失敗的話就拋出異常,而不是返回一個false,那就能夠使用saveThrows()方法來取代,例如以下所看到的:

News news = new News();news.setTitle("這是一條新聞標題");news.setContent("這是一條新聞內容");news.setPublishDate(new Date());news.saveThrows();
使用saveThrows()方法來儲存資料,一旦儲存失敗就會拋出一個DataSupportException異常。我們能夠通過對這個異常進行捕獲來處理儲存失敗的情況。

那有些細心的朋友可能已經注意到。使用的insert()方法來儲存資料時是有傳回值的。返回的是插入行相應的id。但LitePal中的save()方法返回的是布爾值,那麼我們如何才幹拿到儲存成功之後這條資料相應的id呢?對此。LitePal使用了一種非常巧妙的做法。還記得我們在每個實體類中都定義了一個id欄位嗎?當調用save()方法或saveThrows()方法儲存成功之後。LitePal會自己主動將該條資料相應的id賦值到實體類的id欄位上。讓我們來做個實驗吧。代碼例如以下所看到的:

News news = new News();news.setTitle("這是一條新聞標題");news.setContent("這是一條新聞內容");news.setPublishDate(new Date());Log.d("TAG", "news id is " + news.getId());news.save();Log.d("TAG", "news id is " + news.getId());
在save之前列印一下news的id,在save之後再列印一次,如今運行一下,列印結果例如以下所看到的:


OK。在save之前列印的id是0,說明此時id這個欄位還沒有被賦值,在save之後列印的id是1,說明此時id已經被賦值了。那麼我們再到資料庫表中再查看一下這條記錄究竟有沒有儲存成功吧,例如以所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VvbGluX2Jsb2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

能夠看到,這條新聞確實已經儲存成功了,而且相應的id正是1。和我們前面列印的結果是一致的。

只是LitePal的儲存功能顯示不僅僅僅僅有這些使用方法,事實上。LitePal在儲存資料的時候默默幫我們做了非常多的事情,比方多個實體類之間有關聯關係的話,我們不須要考慮在儲存資料的時候怎麼去建立資料與資料之間的關聯,由於LitePal一切都幫我們做好了。

還是通過一個範例來看一下吧,Comment和News之間是多對一的關係,一條News中是能夠包括多條評論的,因此我們就能夠這樣寫:

Comment comment1 = new Comment();comment1.setContent("好評!");comment1.setPublishDate(new Date());comment1.save();Comment comment2 = new Comment();comment2.setContent("贊一個");comment2.setPublishDate(new Date());comment2.save();News news = new News();news.getCommentList().add(comment1);news.getCommentList().add(comment2);news.setTitle("第二條新聞標題");news.setContent("第二條新聞內容");news.setPublishDate(new Date());news.setCommentCount(news.getCommentList().size());news.save();
能夠看到,這裡先是儲存了一條comment1資料,然後儲存一條comment2資料,接著在儲存News之前先把剛才的兩個Comment對象加入到了News的commentList列表其中,這樣就表示這兩條Comment是屬於這個News對象的。最後再把News儲存到資料庫中,這樣它們之間的關聯關係就會自己主動建立了。讓我們查看資料庫表檢查一下吧,首先看一下news表。例如以下所看到的:


OK,第二條新聞已經成功儲存到news表中了。這條新聞的id是2。那麼從哪裡能夠看出來關聯關係呢?我們在上一篇文章中學過,多對一關聯的時候,外鍵是存放在多方的,因此關聯關係我們要到comment表中去查看。例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VvbGluX2Jsb2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

能夠看到,兩條評論都已經成功儲存到comment表中了。而且這兩條評論的news_id都是2,說明它們是屬於第二條新聞的。怎麼樣,僅僅是在儲存資料之前建立好實體類之間的關係,再調用一下save()方法,那麼資料之間的關聯關係就會自己主動建立了。是不是非常easy?上面的代碼僅僅是多對一情況的一種使用方法,另一對一和多對多的情況,其有使用方法都是差點兒相同的,相信你已經能舉一反三了。

另外,LitePal對集合資料的儲存還專門提供了一個方法。比方說我們有一個News集合。那麼應該如何去儲存這個集合中的每條News呢?傳統情況下能夠這樣寫:

List<News> newsList;...for (News news : newsList) {news.save();}
通過一個迴圈來遍曆出這個集合中的每個News對象,然後逐個調用save()方法。

這樣的寫法當然是能夠的。可是效率會比較低,由於調用save()方法的時候除了會運行儲存操作之外。還會去分析News類的關聯關係,那麼每次迴圈都去又一次分析一遍關聯關係顯然是比較耗時的。因此,LitePal提供了一個saveAll()方法,專門用於儲存集合資料的。使用方法例如以下所看到的:

List<News> newsList;...DataSupport.saveAll(newsList);
saveAll()方法接收一個Collection集合參數。僅僅要把待儲存的集合資料傳入就可以。這種方法能夠完畢和上面一段代碼全然一樣的功能,但效率卻會高得多,而且寫法也更加簡單。

好了,這樣我們就把LitePal中提供的儲存操作的使用方法全部都學完了。那麼今天的文章就到這裡。下一篇文章其中會開始解說更新和刪除操作的使用方法。感興趣的朋友請繼續閱讀 Android資料庫高手秘籍(六)——LitePal的改動和刪除操作 。

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

第一時間獲得部落格更新提醒。以及很多其它技術資訊分享,歡迎關注我的公眾號,掃一掃下方二維碼或搜尋號guolin_blog。就可以關注。

Android資料庫高手秘籍(五)——LitePal的儲存操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.