zoukankan      html  css  js  c++  java
  • flutter 数据库sqflite

    首先我要鄙视一下那些博客写一半的人(我叼他螺母),太坑了。

    这边就两个文件main.dart和sqflite_page.dart

    1.添加sqflite插件

    在pubspec.yaml文件中添加sqflite,当前版本1.2.0:(别忘了点击右上角的“Packages get”或者“Packages upgrade”)

    辅助插件: fluttertoast: ^3.0.4

    在lib下新建sqflite.dart文件:

     则新建的sqflite.dart代码如下:

    import 'package:flutter/material.dart';
    import 'package:sqflite/sqflite.dart';
    import 'package:path/path.dart';
    import 'package:fluttertoast/fluttertoast.dart';
    
    
    class SqflitePage extends StatefulWidget{
    
      @override
      State<StatefulWidget> createState() {
        // TODO: implement createState
        return _SqflitePageState();
      }
    
    }
    
    class _SqflitePageState extends State<SqflitePage> {
    
      TextEditingController _nameController=new TextEditingController();
      TextEditingController _ageController=new TextEditingController();
      String _data = "暂无数据";
      String _dbName = 'user.db';//数据库名称
    
      String _createTableSQL ='CREATE TABLE student_table (id INTEGER PRIMARY KEY, name TEXT,age INTEGER)';//创建学生表;
      int _dbVersion = 1;//数据库版本
    
      @override
      void initState() {
        super.initState();
        //创建数据库、学生表
        _createDb(_dbName, _dbVersion, _createTableSQL);
      }
    
    
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        return Scaffold(
          appBar: AppBar(
            iconTheme: IconThemeData(color: Colors.white),
            title: Text("sqflite数据存储",style: TextStyle(color: Colors.white),),
          ),
          body: Container(
            padding: EdgeInsets.all(20),
            child: Column(
              children: <Widget>[
                Center(
                  child: Text("设置进入程序默认创建数据库和一张学生表,如下可对表的姓名、年龄进行增删改查操作:",style: TextStyle(fontSize: 14,color: Color(0xff666666)),),
                ),
                Padding(padding: EdgeInsets.only(top: 10)),
                _getNameInputView(),
                Padding(padding: EdgeInsets.only(top: 10)),
                _getAgeInputView(),
                Padding(padding: EdgeInsets.only(top: 30)),
                _getAddBtnView(),
                Padding(padding: EdgeInsets.only(top: 10)),
                _getdeleteBtnView(),
                Padding(padding: EdgeInsets.only(top: 10)),
                _getUpdateBtnView(),
                Padding(padding: EdgeInsets.only(top: 10)),
                _getQueryBtnView(),
                Padding(padding: EdgeInsets.only(top: 30)),
                Text(_data,style: TextStyle(color: Colors.red,fontSize: 18),)
              ],
            ),
          ),
          resizeToAvoidBottomPadding: false,
        );
      }
    
      _getNameInputView() {
        return TextField(
          keyboardType: TextInputType.text,
          style: TextStyle(color: Color(0xFF888888)),
          controller: _nameController,
          decoration: InputDecoration(
            hintText: "姓名",
            hintStyle: TextStyle(color: Color(0xFF888888)),
            contentPadding: EdgeInsets.only(left: 10,right: 10,bottom: 10,top: 10),
            border: OutlineInputBorder(
              borderRadius: BorderRadius.circular(8.0),
            ),
          ),
        );
      }
    
      _getAgeInputView() {
        return TextField(
          keyboardType: TextInputType.text,
          style: TextStyle(color: Color(0xFF888888)),
          controller: _ageController,
          decoration: InputDecoration(
            hintText: "年龄",
            hintStyle: TextStyle(color: Color(0xFF888888)),
            contentPadding: EdgeInsets.only(left: 10,right: 10,bottom: 10,top: 10),
            border: OutlineInputBorder(
              borderRadius: BorderRadius.circular(8.0),
            ),
          ),
        );
      }
    
      _getAddBtnView(){
        return RaisedButton(
            onPressed: (){
              if(_nameController.text==null||_nameController.text==""){
                Fluttertoast.showToast(msg: "插入数据不能为空!",backgroundColor: Colors.orange);
                return;
              }
              if(_ageController.text==null||_ageController.text==""){
                Fluttertoast.showToast(msg: "插入数据不能为空!",backgroundColor: Colors.orange);
                return;
              }
              String sql = "INSERT INTO student_table(name,age) VALUES('${_nameController.text}','${_ageController.text}')";
              _add(_dbName, sql);
    
            },
            child: Text("插入数据",style: TextStyle(color: Colors.white,fontSize: 18),),
            color: Colors.orange,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(5),
            )
        );
      }
    
      _getdeleteBtnView(){
        return RaisedButton(
            onPressed: (){
    
              String sql = "DELETE FROM student_table";//无条件删除学生表数据
              _delete(_dbName, sql);
            },
            child: Text("删除数据",style: TextStyle(color: Colors.white,fontSize: 18),),
            color: Colors.orange,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(5),
            )
        );
      }
    
      _getUpdateBtnView(){
        return RaisedButton(
            onPressed: (){
              if(_nameController.text==null||_nameController.text==""){
                Fluttertoast.showToast(msg: "姓名不能为空!",backgroundColor: Colors.orange);
                return;
              }
    
              String sql = "UPDATE student_table SET name =? WHERE id = ?";
              _update(_dbName, sql,[_nameController.text,1]);
            },
            child: Text("修改姓名数据",style: TextStyle(color: Colors.white,fontSize: 18),),
            color: Colors.orange,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(5),
            )
        );
      }
    
      _getQueryBtnView(){
        return RaisedButton(
            onPressed: (){
              String sql = 'SELECT * FROM student_table';
              _query(_dbName, sql);
            },
            child: Text("查询数据",style: TextStyle(color: Colors.white,fontSize: 18),),
            color: Colors.orange,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(5),
            )
        );
      }
    
    
      ///创建数据库db
      _createDb(String dbName,int vers,String dbTables) async {
        //获取数据库路径
        var databasesPath = await getDatabasesPath();
        String path = join(databasesPath, dbName);
        print("数据库路径:$path数据库版本$vers");
        //打开数据库
        await openDatabase(
            path,
            version:vers,
            onUpgrade: (Database db, int oldVersion, int newVersion) async{
              //数据库升级,只回调一次
              print("数据库需要升级!旧版:$oldVersion,新版:$newVersion");
            },
            onCreate: (Database db, int vers) async{
              //创建表,只回调一次
              await db.execute(dbTables);
              await db.close();
    
            }
        );
    
        setState(() {
          _data = "成功创建数据库db!
    数据库路径: $path 
    数据库版本$vers";
        });
    
      }
    
    
      ///
      _add(String dbName,String sql) async {
        //获取数据库路径
        var databasesPath = await getDatabasesPath();
        String path = join(databasesPath, dbName);
        print("数据库路径:$path");
    
        Database db = await openDatabase(path);
        await db.transaction((txn) async {
          int count = await txn.rawInsert(sql);
        });
        await db.close();
    
        setState(() {
          _data = "插入数据成功!";
        });
      }
    
    
      ///
      _delete(String dbName,String sql) async {
        var databasesPath = await getDatabasesPath();
        String path = join(databasesPath, dbName);
    
        Database db = await openDatabase(path);
        int count = await db.rawDelete(sql);
        await db.close();
    
        if (count > 0) {
          setState(() {
            _data = "执行删除操作完成,该sql删除条件下的数目为:$count";
          });
        } else {
          setState(() {
            _data = "无法执行删除操作,该sql删除条件下的数目为:$count";
          });
        }
      }
    
      ///
      _update(String dbName,String sql,List arg) async {
        var databasesPath = await getDatabasesPath();
        String path = join(databasesPath, dbName);
    
        Database db = await openDatabase(path);
        int count = await db.rawUpdate(sql,arg);//修改条件,对应参数值
        await db.close();
        if (count > 0) {
          setState(() {
            _data = "更新数据库操作完成,该sql删除条件下的数目为:$count";
          });
        } else {
          setState(() {
            _data = "无法更新数据库,该sql删除条件下的数目为:$count";
          });
        }
      }
    
    
      ///查条数
      _getQueryNum(String dbName,String sql) async {
        var databasesPath = await getDatabasesPath();
        String path = join(databasesPath, dbName);
    
        Database db = await openDatabase(path);
        int count = Sqflite.firstIntValue(await db.rawQuery(sql));
        await db.close();
        return count;
      }
    
      ///查全部
      _query(String dbName,String sql) async {
        var databasesPath = await getDatabasesPath();
        String path = join(databasesPath, dbName);
    
        Database db = await openDatabase(path);
        List<Map> list = await db.rawQuery(sql);
        await db.close();
        setState(() {
          _data = "数据详情:$list";
        });
      }
    
    }

    main.dart中调用代码如下:

    import 'package:flutter/material.dart';
    import 'package:flutter_data_storage/sqflite_page.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.orange,
          ),
          home: MyHomePage(title: 'Flutter学习'),
          routes: <String,WidgetBuilder>{
            sqfliteRoute:(BuildContext context) => SqflitePage(),
          },
        );
      }
    }
    
    const String sqfliteRoute = "SqfliteRoute";
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
    
      @override
      Widget build(BuildContext context) {
        
        return Scaffold(
          appBar: AppBar(
            // Here we take the value from the MyHomePage object that was created by
            // the App.build method, and use it to set our appbar title.
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                RaisedButton(
                  onPressed: (){
                    Navigator.of(context).pushNamed(sqfliteRoute);
                  },
                  child: Text("sqflite",style: TextStyle(fontSize: 18),),
                  
                )
              ],
            ),
          )// This trailing comma makes auto-formatting nicer for build methods.
        );
      }
    }

    跑起来就好,可以好好继续研究了

    最后我要感谢让我脱离苦海的

    https://www.jianshu.com/p/c94326208c27

  • 相关阅读:
    「SOL」开关(LOJ)
    「SOL」星际迷航(LOJ)
    「NOTE」概率生成函数
    「SOL」谢特(LOJ)
    「SOL」重建计划(BZOJ)
    「SOL」Tug of War(洛谷)
    「SOL」同余方程(LOJ)
    「SOL」Bad Cryptography(Codeforces)
    「SOL」小A与两位神仙(洛谷)
    「SOL」Social Distance(AtCoder)
  • 原文地址:https://www.cnblogs.com/gaozhang12345/p/12085340.html
Copyright © 2011-2022 走看看