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

原文地址:https://www.cnblogs.com/gaozhang12345/p/12085340.html