個(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è)就不再講了:
-
點(diǎn)擊頁面的增按鈕,我們要調(diào)用P層的方法去做增操作。效果圖如下:
增1.png -
P層的方法從哪來呢?P層實(shí)現(xiàn)的接口來撒,所以,我們只用在接口定義對(duì)應(yīng)的方法,在P層去實(shí)現(xiàn),效果圖如下:
增2.png -
辣么,具體實(shí)現(xiàn)代碼怎么寫呢?既不記得,我們的裝飾者模式,我們P層里面有一個(gè)DataHelper對(duì)象,通過它去調(diào)用對(duì)應(yīng)的方法就可以了,效果圖如下:
增3.png -
接下來,datahelper的方法又是從哪里來呢?我們的DataHelper是不是實(shí)現(xiàn)了SqlHelper接口,所以,直接在SqlHelper定義方法,在datahelper實(shí)現(xiàn)即可,效果圖如下:
增4.png -
最后,前面只是調(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ì)丟失。步驟如下:
- 修改數(shù)據(jù)庫版本,把1改成2
- User bean里面增加一個(gè)字段id Long類型,遞增即可,clean,build項(xiàng)目
- 在你的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
- 重新運(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ù)庫的簡單的增刪改查




