在flutter中连接mysql

2023-11-02

使用flutter连接mysql

在看本教程之前,请先确定你的flutter可以外部访问,
另外附上如何设置mysql的权限的博客,可以先配置好,
https://www.cnblogs.com/ys15/p/11405732.html

在flutter中是无法使用localhost和127.0.0.1,具体我也不清楚,
需要使用10.0.2.2作为本机ip

这是我使用的数据库,本文做教程,所以建了一个简单的数据库
在这里插入图片描述

博主使用的是这个插件:sqljocky5,根据自己的flutter使用不同的版本,

在这里插入图片描述

正片开始,
首先,配置数据库连接,配置好了过后就可以直接尝试连接,

如果出现errno=111,你可能没有配置mysql的访问权限,需要配置权限

  //todo:数据库连接
  MySqlConnection conn;
  init() async {
    print('配置数据库链接');
    var s = ConnectionSettings(
      user: "root",//todo:用户名
      password: "root",//todo:密码
      host: "10.0.2.2",//todo:flutter中电脑本地的ip
      port: 3306,//todo:端口
      db: "flutter_demo",//todo:需要连接的数据库
    );
    //todo:获取数据库连接
    await MySqlConnection.connect(s).then((_){
      conn=_;
      print('连接成功');
    });
  }

在这里插入图片描述

然后就是sql操作了,

Future execute(String sql);//只能传入sql 不能传参数 用于查询较多

Future executeStreamed(String sql);

Future prepared(String sql, Iterable values);//可以传入参数,传入的是一个集合,可以增删改查

Future preparedStreamed(String sql, Iterable values);

Future<List> preparedMulti(String sql, Iterable values);//多操作,可以传参数

Future prepare(String sql);

汗颜 ,没有注释博主也不懂,求观看的大佬告知,另外感兴趣的可以去看源码,这里不多介绍

先来查询的操作

  String querySql="select name, email from users";
  //todo:查询数据
  query() async{
    _model.clear();
    Results results = await conn.execute(querySql);
    print('查询成功');
    print('${results}');
    results.forEach((row) {
     setState(() {
       model m =model();
       m.name=row.byName('name');//todo:byName里面放的是你数据库返回的字段名
       m.email=row.byName('email');
       _model.add(m);
     });
    });
  }
  //todo:数据解析
  List<model> _model =[];

附上图片

在这里插入图片描述
,然后是修改操作,我们吧id为2的名字改成猪队友,

  //todo:修改数据
  update() async{
     await conn.prepared('UPDATE users SET name = ? WHERE id = ?', [
       '猪队友',2
     ]).then((_){
       print('${_}');
     });
  }

在这里插入图片描述
然后是新增,这个插件是支持多操作的,你可以多新增或者修改,

   //todo:新增单条数据
   insert() async{
     await conn.prepared('insert into users (name, email) values (?, ?)', ['flutter', 'flutter@qq.com']).then((_){
       print('新增id${_.insertId}');
   
     });
   }

在这里插入图片描述

   //todo:新增多条数据 返回id
   insertMuilt() async{
     var results = await conn.preparedMulti(
         'insert into users (name, email) values (?, ?)',
         [['Bob', 'bob@bob.com'],
           ['Bill', 'bill@bill.com'],
           ['Joe', 'joe@joe.com']]);
     print('${results}');
   }

在这里插入图片描述

还有删除数据,我们删除id为2的数据

   //todo:删除数据
  delete() async{
    conn.prepared('DELETE FROM users WHERE id = ?', [
      2
    ]);
    ToastUtils.info('删除成功');
  }

在这里插入图片描述

并且该插件是支持事务的,

  //todo:事务操作 
  transaction() async{
    Transaction trans = await conn.begin();//todo:开启事务
    try {
      //todo:如果没有抛出异常就提交事务
      var result1 = await trans.execute(querySql);
      var result2 = await trans.execute(querySql);
      await trans.commit();
    } catch(e) {
      //todo:事务回滚
      await trans.rollback();
    }
  }
}

每次调用完数据库记得关闭,

谢谢观看                       O - v - O

下面附上完整代码,

import 'package:flutter/material.dart';
import 'package:sqljocky5/connection/connection.dart';
import 'package:sqljocky5/connection/settings.dart';
import 'package:sqljocky5/results/results.dart';

class mysqlDemo extends StatefulWidget {
  @override
  _mysqlDemoState createState() => _mysqlDemoState();
}

class _mysqlDemoState extends State<mysqlDemo> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    init();
  }

  //todo:数据库连接
  MySqlConnection conn;
  init() async {
    print('配置数据库链接');
    var s = ConnectionSettings(
      user: "root",//todo:用户名
      password: "root",//todo:密码
      host: "10.0.2.2",//todo:flutter中电脑本地的ip
      port: 3306,//todo:端口
      db: "flutter_demo",//todo:需要连接的数据库
    );
    //todo:获取数据库连接
    await MySqlConnection.connect(s).then((_){
      conn=_;
      print('连接成功');
    });
  }


  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('链接mysql数据库'),
        centerTitle: true,
      ),
      body: ListView(
        children: <Widget>[
          Wrap(
            children: <Widget>[
              FlatButton(onPressed:query, child: Text('查询数据')),
              FlatButton(onPressed:update, child: Text('修改数据')),
              FlatButton(onPressed:delete, child: Text('删除数据')),
              FlatButton(onPressed:insert, child: Text('新增单条数据')),
              FlatButton(onPressed:insertMuilt, child: Text('新增多条数据')),
            ],
          ),
          getWidget(_model)
        ],
      ),
    );
  }

  String querySql="select name, email from users";
  //todo:查询数据
  query() async{
    _model.clear();
    Results results = await conn.execute(querySql);
    print('查询成功');
    print('${results}');
    results.forEach((row) {
     setState(() {
       model m =model();
       m.name=row.byName('name');//todo:byName里面放的是你数据库返回的字段名
       m.email=row.byName('email');
       _model.add(m);
     });
    });
  }
  //todo:数据解析
  List<model> _model =[];

  //todo:获取widget
  Widget getWidget(List<model> list){
    List<Widget> _list =[];
    for(int i=0;i<list.length;i++){
      _list.add(layout(list[i].name, list[i].email));
    }
    return Column(children:_list,);
  }

  Widget layout(name,email){
    return Text('Name: ${name}, email: ${email}');
  }
  
  //todo:修改数据
  update() async{
     await conn.prepared('UPDATE users SET name = ? WHERE id = ?', [
       '猪队友',2
     ]).then((_){
       print('${_}');
     });
  }

  //todo:新增单条数据
   insert() async{
     await conn.prepared('insert into users (name, email) values (?, ?)', ['flutter', 'flutter@qq.com']).then((_){
       print('新增id${_.insertId}');
     });
   }

   //todo:新增多条数据 返回id
   insertMuilt() async{
     var results = await conn.preparedMulti(
         'insert into users (name, email) values (?, ?)',
         [['aaa', 'aaa@qq.com'],
           ['bbb', 'bbb@qq.com'],
           ['ccc', 'ccc@qq.com']]);
     print('${results}');
   }

   //todo:删除数据
  delete() async{
    conn.prepared('DELETE FROM users WHERE id = ?', [
      2
    ]);
  }

  //todo:事务操作
  transaction() async{
    Transaction trans = await conn.begin();//todo:开启事务
    try {
      //todo:如果没有抛出异常就提交事务
      var result1 = await trans.execute(querySql);
      var result2 = await trans.execute(querySql);
      await trans.commit();
    } catch(e) {
      //todo:事务回滚
      await trans.rollback();
    }
  }
}


//todo:实体类
class model{
  String name;
  String email;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在flutter中连接mysql 的相关文章

  • Flutter 如何制作自定义Tab Bar?

    我正在 Flutter 中构建应用程序 现在我想创建自定义选项卡栏 我想要一个如图所示的标签栏 这是一个使用的解决方案CustomPainter 标签绘制器 非常基本的路径画家来绘制选项卡的背景 class TabPainter exten
  • 将标头添加到 SecureSocket 或 SecurityContext 到 WebSpcket

    WebSocket 可以选择向请求添加标头 但不能向其中添加 SecurityContext SecureSocket 具有 SecurityContext 因此我可以添加 ssl 证书 但无法添加标头 对此有什么想法吗 UPDATE 我正
  • 如何修复颤振中的“net::ERR_CLEARTEXT_NOT_PERMITTED”

    我已经在 flutter 中实现了 webView 但它没有打开我的 php 网站 该网站位于服务器上 我做错了 我是 flutter 新手 尝试使用 webview 将我的网站网页集成到我的应用程序中 但没有成功 Widget build
  • flutter SDK是否提供了为Windows Phone开发应用程序的框架?

    我想知道google是否计划支持除iOS和Android以外的任何其他平台使用Flutter进行跨平台开发 像React Native Windows for React Native一样 Flutter是否有支持Windows Phone
  • 在 Flutter 中逐个更改多个按钮的颜色

    单击 Go 按钮后 我希望按钮 1 变为红色 然后转回白色 然后按钮 2 应变为红色 然后恢复为白色 然后是3 4等等 我可以设计我的回调按钮 使按钮 1 变成红色 我不确定如何在 2 秒后将其变回白色 然后将下一个按钮变为红色等等 主程序
  • 如何使用 Flutter/Dart 根据选择将单个 Firestore 文档 ID 传递给另一个类?

    我正在尝试使用 flutter 设计一个功能 当用户选择旅行的缩略图时 它会将用户带到一个页面 其中包含他们选择的旅行的更多详细信息 我试图尽可能少地查询 Firestore 数据库 因此我试图从单个查询快照中获取文档 ID 并将其传递给
  • 如何使用 Flutter (Dart) 在 android 13 (API 33) 上保存文件

    文件不仅仅是媒体文件 也可能是 pdf zip xls 等 API 33 上的外部存储权限被永久拒绝 所以 我们不能像这样的方法来保存 gt String path This is external storage path File pa
  • 导航到新屏幕时状态栏颜色

    我在我的中使用以下build 第一个屏幕更改状态栏颜色的方法 效果很好 1st screen s build method SystemChrome setSystemUIOverlayStyle SystemUiOverlayStyle
  • 未为“AudioCache”类型定义“play”方法

    问题 未为 AudioCache 类型定义 play 方法 导入 包 flutter material dart 导入 包 audioplayers src audio cache dart void main runApp Xylopho
  • Firebase云函数在Flutter中返回null,因为它仍在运行

    更新 我从我的 firebase 控制台得到这个 函数执行花费了 2906 毫秒 完成状态代码 200 15 秒后 我得到 console log DOC 确实存在 我正在运行这个云火库功能 它 有效 但我不断得到这样的回报 FLUTTER
  • 如何使用 SingleChildScrollView 使 Stacklayout 可滚动?

    我正在尝试使用 SingleChildScrollView 使堆栈布局可滚动 但它不滚动 这里应该使用SingleChildScrollView吗 我想我已经给出了足够的描述 可以让任何人理解我的问题 这里有更多文本以满足 StackOve
  • 颤振文本小部件仅显示最后一个条目

    我正在尝试在 flutter 中创建日历 目前我正在实施这些活动 为了测试这一点 我创建了一个方法来检查当前日期 即创建行的时间 是否有事件 如果是这种情况 则会在表示内容的容器中打印 x 整个事情只是第一次测试 看它是否在原则上有效 当我
  • 在 main.dart 中使用 FutureBuilder

    下面的代码总是显示 OnboardingScreen 一段时间 可能是几毫秒 然后显示 MyHomePage 我相信你们都明白我想做什么 我正在使用 FutureBuilder 来检查 getString 方法是否有数据 我有什么错 或者还
  • 如何在 flutter 搜索页面小部件中消除搜索建议?

    我需要使用默认 flutter 的 Google 地方信息搜索建议搜索页 每当用户开始输入时 我都需要提供自动完成建议 并且我使用异步方式实现了这一点FutureBuilder 现在的问题是我需要将搜索请求的调度去抖 500 毫秒或更长时间
  • CustomPainter 使用 Listenable 重绘

    CustomPainter 类似乎有几种触发重绘的方法 我让我的画家使用 shouldRepaint 方法 但是 我希望我的画家对可监听中的更改做出反应 而不是轮询更改 Flutter 文档指出 触发重绘的最有效方法是 扩展此类并向 Cus
  • 如何在 Flutter 移动端、网页端和窗口端添加条件导入?

    我有 flutter 应用程序 它为每个平台 移动 网络 窗口 使用不同的 webview 插件 虽然我有能力import平台基于web and mobile 我无法导入 Windows 版本 如果不是移动或网络 我尝试添加其他条件 但它需
  • 没有为类型“Object”定义运算符“[]”。尝试定义运算符“[]”

    我的代码在下面给出了我在这一行中从 firebase 访问用户名时遇到的问题的错误 snapshot data username 它给出了上面提到的错误 我知道访问地图数据的唯一方法是这个 FutureBuilder future Fire
  • 颤振动态形式无法正常工作

    在我的应用程序中 我想创建一组动态表单 用户可以在其中添加更多项目 在这种动态形式中 它由两个文本字段 1 电话字段 2 电子邮件字段和一个下拉字段组成 但我尝试的任何事情都无法正常工作 我已经要求修复我的代码 但没有得到答复 堆栈溢出问题
  • Flutter - 名称为 [DEFAULT] 的 FirebaseApp 不存在

    我正在使用 firebase 身份验证系统和 Firestore 开发一个 flutter 应用程序 我工作了3个月 之前没有遇到过这个错误 现在我在 Play 商店上发布了我的应用程序 并且我发现使用模拟器的调试版本也出现此错误 我认为已
  • 在没有动画的情况下替换 MaterialApp 中的初始路线?

    我们的应用程序建立在Scaffold到目前为止 我们已经能够使用内部提供的调用来满足我们的大部分路由和导航要求NavigatorState pushNamed pushReplacementNamed ETC 但我们不想要的是 当用户从抽屉

随机推荐

  • 聚簇索引,二级索引与联合索引的概念

    1 聚簇索引 聚簇索引并不是一种单独的索引结构 而是一种数据类型 用户所有的记录全部被存放到了b 树中的叶子节点 所谓索引即数据 数据即索引 聚集索引存储的数据结构为b 树 也就是说表被创建后 在磁盘里默认生成的就是b 树的结构 B 树分为
  • 【Redis学习】Redis10大数据类型

    总体概述 这里说的数据类型是value的数据类型 key的类型都是字符串 redis字符串 String string是redis最基本的类型 一个key对应一个Tvalue string类型是二进制安全的 意思是redis的string可
  • en结尾的单词_以en结尾的形容词

    以en结尾的形容词有broken fallen chosen sudden spoken laden litten rotten linen dozen等 以en结尾的形容词 en结尾的形容词 broken fallen chosen su
  • SPI通信以及与W2Q564(ROM)交换(读写)数据

    一 SPI协议简介 SPI 协议是由摩托罗拉公司提出的通讯协议 Serial Peripheral Interface 即串行外围设备接口 允许芯片与外部设备以全双工 同步 串行方式通信 此接口可以被配置成主模式 并为外部从设备提供通信时钟
  • TensorFlow的Session工作原理

    Session是Graph和执行者之间的媒介 Session run 实际上将graph fetches feed dict序列化到字节数组中 并调用tf session TF Run 参见 usr local lib python2 7
  • Flink 在唯品会的实践

    唯品会自 2017 年开始基于 k8s 深入打造高性能 稳定 可靠 易用的实时计算平台 支持唯品会内部业务在平时以及大促的平稳运行 现平台支持 Flink Spark Storm 等主流框架 本文主要分享 Flink 的容器化实践应用以及产
  • php rdkafka实例,【译】PHP Kafka客户端 - php-rdkafka

    本文翻译自php rdkafka的README 项目地址 PHP rdkafka是一个轻量的librdkafka封装 提供了一个 PHP 5 PHP 7 Kafka客户端 它支持高级和低级消费者 生产者 以及元数据API 它的API尽可能地
  • 交叉编译gstreamer

    编译gstreamer 1 3 2 gst plugins base 1 3 2 gst plugins good 1 3 2 gst plugins bad 1 3 2 gst plugins ugly 1 3 2 export PKG
  • 【解决】通用串行总线控制器全是感叹号

    系统 Win10 问题背景 更新某软件并重启后 USB插入外设无反应 问题查找 打开设备管理器 发现通用串行总线控制器下的设备驱动全部显示黄色感叹号 解决办法 1 运行注册表编辑器 开始 gt 运行 gt regedit 2 依次展开HKE
  • Pandas时间戳与时间差

    目录 时间戳 时间戳构造 时间戳序列生成 时间戳序列的索引与切片 使用布尔条件获取时间戳子序列 使用 索引切片获取时间戳子序列 使用dt对象获取时间戳子序列 dt对象详解 时间差 时间差生成 生成时间差序列 补充 时间戳 时间戳构造 imp
  • git 速度很慢的解决办法 git慢

    原因 git clone特别慢是因为github global ssl fastly net域名被限制了 只要找到这个域名对应的ip地址 然后在hosts文件中加上ip即可解决 查询github com地址 https ipaddress
  • 华医网自动答题小脚本软件,并收集答案保存起来

    华医网的考试有不固定性 比如出现题的顺序不同 选择出现的位置不同 这次是A下次不一定就是 要注意2个地方 一个是题的选择一般最多是5个选择所有最多就循环5次选择 自动答题 先用列表把题目和选择都保存起来 提交答案后如果是错的就删除如果是对的
  • Java基础:Java接口和抽象类

    文章目录 一 抽象类 1 1概念 1 2抽象类的特点 二 接口 2 1概念 2 2特点 2 3接口格式 2 4接口实现 2 5接口的继承 2 6接口与类相似点 2 7接口与类的区别 2 8抽象类和接口的区别 三 标记接口 一 抽象类 1 1
  • 增大计算机字体,怎么调整电脑字体大小?

    腾讯视频 爱奇艺 优酷 外卖 充值4折起 小编整理了以下几种方法 一 点击开始 控制面板 在控制面板中选择外观和个性化 在外观和个性化中 选择放大或缩小文本和其他项目 在这里我们选择中等125 点击应用 弹出了对话框提示是否重启 我们点击稍
  • Matlab实现最优化(附上多个完整仿真源码)

    最优化是一种寻找最优解的数学方法 它在各个领域都有广泛的应用 在Matlab中 有多种工具箱和函数库可以用来实现最优化 下面我们来介绍一下如何用Matlab实现最优化 1 定义目标函数 在开始最优化之前 需要定义一个目标函数 目标函数是一个
  • CRC校验算法及C++程序实现

    CRC校验可以运用于传输数据过程中的验证 发送端发送有效数据时 先根据有效数据和生成多项式 比如CCITT标准的多项式是X16 X12 X5 1 计算出CRC校验码 把CRC校验码加到有效数据后面一起发送 当接收数据时 取出前面有效数据部分
  • 单点区域生长算法

    1 理论基础 区域生长算法的基本思想是将有相似性质的像素点合并到一起 对每一个区域要先指定一个种子点作为生长的起点 然后将种子点周围领域的像素点和种子点进行对比 将具有相似性质的点合并起来继续向外生长 直到没有满足条件的像素被包括进来为止
  • [问题解决]不使用PWM调速系统,彻底解决一个L298N带动两个电机却转速不同的问题...

    问题描述 由单片机的VCC引脚供电 使用L298N控制两个电机 发现左右两个轮子的转速老是不一样 更多的情况是左轮转速高 左轮电机接OUT1和OUT2 右轮转速低 右轮电机接OUT3和OUT4 甚至不转 需要用手戳一下才转 在这种情况下 如
  • 属性(property)与成员变量(ivar)有什么区别?

    property 的本质是什么 property ivar getter setter 下面解释下 属性 property 有两大概念 ivar 实例变量 存取方法 access method getter setter 属性 proper
  • 在flutter中连接mysql

    使用flutter连接mysql 在看本教程之前 请先确定你的flutter可以外部访问 另外附上如何设置mysql的权限的博客 可以先配置好 https www cnblogs com ys15 p 11405732 html 在flut