flutter-数据库老相识之增、删、改、查

这算是我写文章以来,第一篇和第二篇文章,更新时间,如此守时的开始.当然,我还是不会讲解删除数据库的.客官里边请

前文回顾,如果你还不知道怎么创建数据库,可以看看
flutter-数据库创建.看过的请往下搂一眼.

您能在这里看到啥

  1. 运行效果
  2. DEMO地址

运行效果

sql_over_g.gif

说到这个,突然让我想起儿时被迫营业的一篇文章,《润土》,好像也有个,哈哈哈.有点冷.回归正道,继续讲解,不过,这个《润土》里的,还是可以在你们酒局上,玩逛公园,可以一语惊人的回答呢,喜欢玩的同学,可以下次试一试,绝对,意想不到.

好了.收.

在我们DEMO中,其实,入你眼里的第一个列表也,其实就是我们所说的查,细想一下,在我们的业务场景中,如果不涉及登录,其实大部分都是查用的比较频繁点.来,我们看看 ,为了这个,我在项目中准备了什么.

  1. sql原始查询语句封装

    • 不分页查询
    /// sql助手查找列表(不分页)
    /// @tableName:表名 
    /// @selects 查询的字段数组,也就是你想要等到的数据字段集合
    /// @wheres 条件,如:'uid=? and fuid=?' 
    /// @whereArgs 参数数组
    Future> queryListByHelper({
        required String tableName,
        required List selects,
        required String whereStr,
        required List whereArgs,
    }) async {
        List 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> queryListforpageHelper({
       required String tableName,
       required List selects,
       required String whereStr,
       required List whereArgs,
       required int page,
       required int size,
       String? orderBy,
    }) async {
       List 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> queryList({
         required String sql,
     }) async {
         return await db!.rawQuery(sql);
     }
    
  2. sql查询使用

    来看看我是怎么使用的,我这里只是做了简单的分页列表查询,其实一个就已经包含了其他两个.就不用一一举例了

    • 封装获取列表数据
    /// 获取列表数据,我这是根据发布的时间,做了降序的排列
    Future> loadsqllist({
        required SqlUtils sqlUtils,
        required int page,
    }) async {
        List 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 list = [];
        List info = await loadsqllist(sqlUtils: sqlUtils, page: page);
        list.addAll(info);
        sqlUtils.close();
        return list;
    }
    

    所以前面的封装,最终还是为了业务层,能简单方便的使用,业务层,只需要关注我给你page或者uid+page,你给我数据就行,具体拿到数据怎么处理,这就是业务层的职责了.

通过上面的,我们发现,暂时本地是没有任何数据的,这就需要我们来增加点数据,最起码有点东西可以看.好,说干就干

  1. 运行效果
add_g.gif
  1. sql原始插入语句封装
  • sql原生插入

       /// sql原生插入
       /// eg:
       /// SqlUtils sqlUtils = SqlUtils();
       /// await sqlUtils.open();
       /// await sqlUtils.insert('INSERT INTO List(name, value) VALUES(?, ?)',['name', 'name']);
       Future 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 insertByHelper({
          required String tableName,
          required Map paramters,
      }) async {
          return await db!.insert(
              tableName,
              paramters,
          );
      }
    
  1. 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"});
              }
          });
      }
    

有了数据后,有的时候,我们还是需要修改数据的,这样刚好,我们来看一下怎么修改修改吧

  1. 运行效果


    update_g.gif
  2. sql原始修改数据封装

    • sql原生修改
      ///sql原生修改
      Future 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 updateByHelper({
        /// 表名
        required String tableName,
        /// 需要修改的数据
        required Map setArgs,
        /// 根据条件,获取需要修改数据
        required String whereStr,
        /// 条件
        required List whereArgs,
    }) async {
        return await db!.update(
            tableName,
            setArgs,
            where: whereStr,
            whereArgs: whereArgs,
        );
    }
    

3 sql修改数据使用
由于更新并不复杂,所以我这里直接在业务层直接调用了封装的方法.

 /// 更新数据
 updateData({required ListModel listModel}) async {
     SqlUtils sqlUtils = SqlUtils();
     listModel.updatetime = DateUtil.getNowDateMs();
     Map 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"});
         }
     });
 }

有了数据后,有的时候,我们还是需要删除数据的,这样刚好,我们来看一下怎么删除数据吧

  1. 运行效果


    delect_g.gif
  2. sql原始删除数据封装

    • sql原生删除
    ///sql原生删除
      Future 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 deleteByHelper({
          required String tableName,
          required String whereStr,
          required List whereArgs,
      }) async {
          return await db!.delete(
              tableName,
              where: whereStr,
              whereArgs: whereArgs,
          );
      }
    
  3. 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();这个方法

相关文章

flutter-数据库

你可能感兴趣的:(flutter-数据库老相识之增、删、改、查)