这算是我写文章以来,第一篇和第二篇文章,更新时间,如此守时的开始.当然,我还是不会讲解删除数据库的.客官里边请👇
前文回顾,如果你还不知道怎么创建数据库,可以看看
flutter-数据库创建.看过的请往下搂一眼.
您能在这里看到啥
- 运行效果
- 查
- 增
- 改
- 删
- DEMO地址
运行效果
查
说到这个查,突然让我想起儿时被迫营业的一篇文章,《润土》,好像也有个,哈哈哈.有点冷.回归正道,继续讲解,不过,这个《润土》里的查,还是可以在你们酒局上,玩逛公园,可以一语惊人的回答呢,喜欢玩的同学,可以下次试一试,绝对,意想不到.
好了.收.
在我们DEMO中,其实,入你眼里的第一个列表也,其实就是我们所说的查,细想一下,在我们的业务场景中,如果不涉及登录,其实大部分都是查用的比较频繁点.来,我们看看 ,为了这个查,我在项目中准备了什么.
-
sql原始查询语句封装
- 不分页查询
/// sql助手查找列表(不分页) /// @tableName:表名 /// @selects 查询的字段数组,也就是你想要等到的数据字段集合 /// @wheres 条件,如:'uid=? and fuid=?' /// @whereArgs 参数数组 Future<List<Map>> queryListByHelper({ required String tableName, required List<String> selects, required String whereStr, required List whereArgs, }) async { List<Map> maps = await db!.query( tableName, columns: selects, where: whereStr, whereArgs: whereArgs, ); return maps; }
- 分页查询
/// sql 分页查询 /// SqlUtils sqlUtils = SqlUtils(); /// await sqlUtils.open(); /// List list = await sqlUtils.queryListforpageHelper( /// ['uid'], 查询返回的数据字段 /// 'uid = ?', 查询字段 /// [1], 对应的查询条件 /// page, 当前页数 /// 10, 每页个数 /// orderBy: "createTime DESC" 根据对应字段进行排序 DESC 从大到小排序 ---降序排列 ASC 从小到大排序 -- 升序排列 /// /// ); Future<List<Map>> queryListforpageHelper({ required String tableName, required List<String> selects, required String whereStr, required List whereArgs, required int page, required int size, String? orderBy, }) async { List<Map> maps = await db!.query( tableName, columns: selects, where: whereStr, whereArgs: whereArgs, limit: size, offset: (page - 1) * size, orderBy: orderBy, ); return maps; }
- sql原生语句查询
/// sql原生查找列表 /// eg: /// SqlUtils sqlUtils = SqlUtils(); /// await sqlUtils.open(); /// await sqlUtils.queryList( /// "select * from ${SqlConfig.list} where ${uid} = '$userId'" /// ); Future<List<Map>> queryList({ required String sql, }) async { return await db!.rawQuery(sql); }
-
sql查询使用
来看看我是怎么使用的,我这里只是做了简单的分页列表查询,其实一个就已经包含了其他两个.就不用一一举例了
- 封装获取列表数据
/// 获取列表数据,我这是根据发布的时间,做了降序的排列 Future<List<ListModel>> loadsqllist({ required SqlUtils sqlUtils, required int page, }) async { List<ListModel> list = []; await sqlUtils.open(); List ulist = await sqlUtils.queryListforpageHelper( tableName: SqlConfig.list, selects: [ ListModelId.uid, ListModelId.listid, ListModelId.title, ListModelId.createtime, ListModelId.updatetime, ], whereStr: '${ListModelId.uid} = ?', whereArgs: [1], page: page, size: 10, orderBy: "${ListModelId.updatetime} DESC", ); await sqlUtils.close(); if (ulist.isNotEmpty) { for (var item in ulist) { ListModel model = ListModel.fromMap(item); list.add(model); } } return list; }
从代码中我们可以看到flutter-数据库创建这篇文章中,我们定义的ListModel模型,以及我们定义的ListModelId宏定义类的好处,这里我们就不用手拼,我们需要的字段的名字,减少不必要的问题的产生.
从代码中,我是通过uid这个关键词,进行查询的.通过 updatetime 这个关键词,使用DESC进行降序排序,当然也可以使用ASC进行升序排列.
- 业务层 数据库查询使用
/// 获取列表 queryListData({ required int page, }) async { SqlUtils sqlUtils = SqlUtils(); List<ListModel> list = []; List<ListModel> info = await loadsqllist(sqlUtils: sqlUtils, page: page); list.addAll(info); sqlUtils.close(); return list; }
所以前面的封装,最终还是为了业务层,能简单方便的使用,业务层,只需要关注我给你page或者uid+page,你给我数据就行,具体拿到数据怎么处理,这就是业务层的职责了.
增
通过上面的查,我们发现,暂时本地是没有任何数据的,这就需要我们来增加点数据,最起码有点东西可以看.好,说干就干
- 运行效果
- sql原始插入语句封装
-
sql原生插入
/// sql原生插入 /// eg: /// SqlUtils sqlUtils = SqlUtils(); /// await sqlUtils.open(); /// await sqlUtils.insert('INSERT INTO List(name, value) VALUES(?, ?)',['name', 'name']); Future<int> insert({ required String sql, required List paramters, }) async { return await db!.rawInsert( sql, paramters, ); }
- sql助手插入
///sql助手插入 @tableName:表名 @paramters:参数map /// eg: /// SqlUtils sqlUtils = SqlUtils(); /// await sqlUtils.open(); /// await sqlUtils.insertByHelper(SqlConfig.list, {"uid":uid,"name":name}); Future<int> insertByHelper({ required String tableName, required Map<String, dynamic> paramters, }) async { return await db!.insert( tableName, paramters, ); }
-
sql插入数据使用
- 封装插入数据
/// 插入数据 inserData({ required SqlUtils sqlUtils, required ListModel model, }) async { await sqlUtils.open(); int state = await sqlUtils.insertByHelper( tableName: SqlConfig.list, paramters: model.toMap()); return state != -1 ? true : false; }
只是针对了添加列表数据,做了一层封装.
- 业务层使用
/// 新增数据 addData({required String msg}) async { ListModel model = ListModel(); model.createtime = DateUtil.getNowDateMs(); model.updatetime = DateUtil.getNowDateMs(); model.title = msg; SqlUtils sqlUtils = SqlUtils(); await sqlUtils.open(); bool yorn = await inserData(sqlUtils: sqlUtils, model: model); await sqlUtils.close(); String str = "添加成功"; if (!yorn) { str = "添加失败"; } /// 这里直接做了添加成功与失败的处理, /// 你也可以把状态告诉使用者, /// 具体业务具体分析 showtoastmsg( msg: str, ontap: () { if (yorn) { currentGoback(Get.context!, info: {"rl": "1"}); } }); }
改
有了数据后,有的时候,我们还是需要修改数据的,这样刚好,我们来看一下怎么修改修改吧
-
运行效果
-
sql原始修改数据封装
- sql原生修改
///sql原生修改 Future<int> update({ required String sql, required List paramters, }) async { //样例:dbUtil.update('UPDATE relation SET fuid = ?, type = ? WHERE uid = ?', [1,2,3]); return await db!.rawUpdate( sql, paramters, ); }
- sql助手修改
/// sql助手更新数据 Future<int> updateByHelper({ /// 表名 required String tableName, /// 需要修改的数据 required Map<String, Object?> setArgs, /// 根据条件,获取需要修改数据 required String whereStr, /// 条件 required List whereArgs, }) async { return await db!.update( tableName, setArgs, where: whereStr, whereArgs: whereArgs, ); }
- sql原生修改
3 sql修改数据使用
由于更新并不复杂,所以我这里直接在业务层直接调用了封装的方法.
/// 更新数据
updateData({required ListModel listModel}) async {
SqlUtils sqlUtils = SqlUtils();
listModel.updatetime = DateUtil.getNowDateMs();
Map<String, Object?> par = listModel.toMap();
await sqlUtils.open();
int type = await sqlUtils.updateByHelper(
tableName: SqlConfig.list,
setArgs: par,
whereStr: '${ListModelId.listid} = ?',
whereArgs: [listModel.listid]);
await sqlUtils.close();
String str = "更新成功";
if (type != 1) {
str = "更新失败";
}
showtoastmsg(
msg: str,
ontap: () {
if (type == 1) {
currentGoback(Get.context!, info: {"rl": "1"});
}
});
}
删
有了数据后,有的时候,我们还是需要删除数据的,这样刚好,我们来看一下怎么删除数据吧
-
运行效果
-
sql原始删除数据封装
- sql原生删除
///sql原生删除 Future<int> delete({ required String sql, required List parameters, }) async { //样例:await dbUtil.delete('DELETE FROM relation WHERE uid = ? and fuid = ?', [123,234]); return await db!.rawDelete( sql, parameters, ); }
- sql助手删除
///sql助手删除 刪除全部whereStr和whereArgs传null Future<int> deleteByHelper({ required String tableName, required String whereStr, required List whereArgs, }) async { return await db!.delete( tableName, where: whereStr, whereArgs: whereArgs, ); }
-
sql删除使用
- 封装删除
/// 删除数据 delectpublish({ required SqlUtils sqlUtils, required int listid, }) async { await sqlUtils.open(); int state = await sqlUtils.deleteByHelper( tableName: SqlConfig.list, whereStr: "${ListModelId.listid} = ?", whereArgs: [listid], ); return state != -1 ? true : false; }
- 业务层使用删除
/// 删除数据 delectData({ required int listid, }) async { SqlUtils sqlUtils = SqlUtils(); bool yorn = await delectpublish(sqlUtils: sqlUtils, listid: listid); sqlUtils.close(); return yorn; }
到此,老相好也算是简单的完成,
需要注意的
切记数据库打开后,使用完了,一定要关闭,调用await sqlUtils.close();这个方法