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

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

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

您能在这里看到啥

  1. 运行效果
  2. DEMO地址

运行效果

sql_over_g.gif

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

好了.收.

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

  1. 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);
     }
    
  2. 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,你给我数据就行,具体拿到数据怎么处理,这就是业务层的职责了.

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

  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<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,
          );
      }
    
  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<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,
        );
    }
    

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"});
         }
     });
 }

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

  1. 运行效果


    delect_g.gif
  2. 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,
          );
      }
    
  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-数据库

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容