從零開始搭建一個(gè)主流項(xiàng)目框架(五)—GreenDao的增刪改查

個(gè)人博客:haichenyi.com。感謝關(guān)注

??上一篇我們講了GreenDao的數(shù)據(jù)庫的依賴和創(chuàng)建,這一篇,我們來講常用的增刪改查四種方法。我們操作數(shù)據(jù)庫都是Dao層,不同的表,有不懂的Dao層對(duì)象。我們上一篇的數(shù)據(jù)庫接口的實(shí)現(xiàn)類里面,我們定義了UserDao,我們這一篇講的就是操作我們昨天創(chuàng)建的user表。

??在寫下面幾個(gè)方法之前,我還是先把MVP的用法先講一遍吧,防止有人不知道,以增操作為例,另外三個(gè)就不再講了:

  1. 點(diǎn)擊頁面的增按鈕,我們要調(diào)用P層的方法去做增操作。效果圖如下:


    增1.png
  2. P層的方法從哪來呢?P層實(shí)現(xiàn)的接口來撒,所以,我們只用在接口定義對(duì)應(yīng)的方法,在P層去實(shí)現(xiàn),效果圖如下:


    增2.png
  3. 辣么,具體實(shí)現(xiàn)代碼怎么寫呢?既不記得,我們的裝飾者模式,我們P層里面有一個(gè)DataHelper對(duì)象,通過它去調(diào)用對(duì)應(yīng)的方法就可以了,效果圖如下:


    增3.png
  4. 接下來,datahelper的方法又是從哪里來呢?我們的DataHelper是不是實(shí)現(xiàn)了SqlHelper接口,所以,直接在SqlHelper定義方法,在datahelper實(shí)現(xiàn)即可,效果圖如下:


    增4.png
  5. 最后,前面只是調(diào)用了,具體實(shí)現(xiàn)在哪里呢?我之前有沒有講過裝飾者模式,一個(gè)接口,兩個(gè)實(shí)現(xiàn)方法,對(duì),沒錯(cuò),就是在SqlImpl方法里面實(shí)現(xiàn),效果圖如下:


    增5.png

??通過以上5步,就完成我們的增操作。有同鞋就會(huì)問,那參數(shù)怎么傳?我特么怎么知道需要傳什么傳輸,你這個(gè)方法是干什么的,調(diào)用這個(gè)方法需要什么數(shù)據(jù),你就丟在參數(shù)里面?zhèn)鬟^去,即可。

方法

//插入單個(gè)對(duì)象
userDao.insert(user);

//插入一個(gè)list
userDao.insertInTx(users);

調(diào)用

//basePresenter.onAdd(User("小紅", 1, 165, "50KG", 18))
val dataList = mutableListOf<User>()
dataList.add(User("小剛", 2, 175, "60KG", 28))
dataList.add(User("小東", 2, 185, "65KG", 25))
basePresenter.onAddList(dataList)

效果圖我就不貼出來了,如果,你的效果出不來,就肯定是你的代碼寫的有問題,我寫這個(gè)博客都是邊寫代碼,邊寫博客,我這邊肯定是沒問題的。

方法

//查詢單個(gè)對(duì)象
userDao.queryBuilder().where(UserDao.Properties.Name.eq(name)).build().unique();
//查詢一個(gè)list
userDao.queryBuilder().where(UserDao.Properties.Name.eq(name)).build().list();

調(diào)用

val user = basePresenter.onSelect("小紅")
println(user.name)
val users = basePresenter.onSelectList("小東")
 users.forEach {
     println(it.name)
 }

??這里,我需要做一點(diǎn)說明,那就是手動(dòng)能力強(qiáng)的寶寶,看見有兩個(gè)查詢方法,一個(gè)查詢一個(gè)對(duì)象,一個(gè)查詢list,這兩個(gè)方法沒問題,查詢肯定是查詢的一個(gè),list里面也是只有一個(gè)對(duì)象,就有寶寶想著多插入幾條數(shù)據(jù),這個(gè)時(shí)候,項(xiàng)目就可能崩掉,因?yàn)?,你插入的名字是相同的,我們這里名字是作為主鍵,表里面主鍵是不能相同的,所以就崩掉了,所以,你就得改表結(jié)構(gòu),正好測(cè)試我們之前說的版本更新問題,我這里親測(cè)可用,數(shù)據(jù)也不會(huì)丟失。步驟如下:

  1. 修改數(shù)據(jù)庫版本,把1改成2
  2. User bean里面增加一個(gè)字段id Long類型,遞增即可,clean,build項(xiàng)目
  3. 在你的Activity里面會(huì)報(bào)錯(cuò),因?yàn)?,你User的構(gòu)造方法里面新增了一個(gè)參數(shù),辣么這里你用的時(shí)候參數(shù)個(gè)數(shù)都不對(duì),肯定報(bào)錯(cuò),你把id字段對(duì)應(yīng)的參數(shù)傳null即可,他自己遞增。這里也只有Long類型可以傳null
  4. 重新運(yùn)行項(xiàng)目,沒有問題

方法

/*//通過主鍵刪除一個(gè)對(duì)象,刪除滿足條件的第一個(gè)對(duì)象
    User user1 = userDao.queryBuilder().where(UserDao.Properties.Name.eq(name)).build().unique();
    //一定要記得做非空判斷
    if (user1 != null) {
      userDao.deleteByKey(user1.getId());
    } else {
      ToastUtils.Companion.showTipMsg("為查詢到相關(guān)數(shù)據(jù)");
    }*/

    //通過主鍵刪除一個(gè)滿足條件的List
    List<User> list = userDao.queryBuilder().where(UserDao.Properties.Name.eq(name)).build().list();
    if (list.size() > 0) {
      List<Long> keys = new ArrayList<>();
      for (User user : list) {
        keys.add(user.getId());
      }
      userDao.deleteByKeyInTx(keys);
    } else {
      ToastUtils.Companion.showTipMsg("為查詢到相關(guān)數(shù)據(jù)");
    }

調(diào)用

//basePresenter.onDelete("小紅")
basePresenter.onDelete("小東")

方法

List<User> list = userDao.queryBuilder().where(UserDao.Properties.Name.eq(oldName)).build().list();
    if (list.size() > 0) {
      for (User user : list) {
        user.setName(newName);
      }
//      userDao.update(user1);
      userDao.updateInTx(list);
      ToastUtils.Companion.showTipMsg("修改成功");
    } else {
      ToastUtils.Companion.showTipMsg("未查詢到相關(guān)數(shù)據(jù)");
    }

調(diào)用

basePresenter.onUpdate("小剛", "小貝")

完了,數(shù)據(jù)庫的簡單的增刪改查

項(xiàng)目鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容