美文网首页一起来学Flutter~Android开发经验谈程序员
Flutter 26: 图解关乎 SQL 数据库的二三事 (一)

Flutter 26: 图解关乎 SQL 数据库的二三事 (一)

作者: 阿策神奇 | 来源:发表于2018-12-19 21:11 被阅读8次

          小菜刚刚学习一下关于数据存储方面的小知识点,用 sqflite 对数据库进行基本操作。sqflite 为三方 pub 通用的引入方式。小菜仅对数据库的基本操作进行学习整理。

    集成方式

    1. pubspec.yaml 中添加 sqflite: any
    2. 在相应的 .dart 文件中添加引用 import 'package:sqflite/sqflite.dart';
    3. 根据需求对数据存储进行具体的 SQL 操作,如下:

    SQL 操作

    1. 创建数据库

          sqflite 创建数据库时优先创建一个路径,用来存储数据库。注:对于数据库的操作都是耗时操作,都要通过 asyncawait 异步处理。

    FlatButton(
        color: Colors.blue,
        child: Text('创建一个 flutter_app.db 数据库'),
        onPressed: () async {
          var databasesPath = await getDatabasesPath();
          path = join(databasesPath, 'flutter_app.db');
        }),
    

    2. 创建数据表

          借助 db.execute 来创建一张数据表,跟普通的 SQL 方式相同。

    FlatButton(
        color: Colors.blue,
        child: Text('创建一张 user 表'),
        onPressed: () async {
          db = await openDatabase(path, version: 1,
              onCreate: (Database db, int version) async {
            await db.execute(
                'CREATE TABLE User (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, address TEXT)');
          });
        }),
    

    3. 【增】插入数据

          借助 rawInsertdb.insert 对数据库表数据进行插入。根本上都是通过 insert into 方式插入数据表。

    // db.transaction
    _transactionOneUser(UserBean userBean) async {
      await db.transaction((txn) async {
        await txn.rawInsert(
            'INSERT INTO User(name, age, address) VALUES(${userBean.name}, '
            '${userBean.age},'
            '${userBean.address}'
            ')');
      });
    }
    
    // db.insert
    _insertOneUser(var tableName, UserBean userBean) async {
      await db.insert(tableName, userBean.toMap());
    }
    

    4. 【查】查询数据

          借助 rawQuerydb.select 对数据库表信息进行查询,是操作最灵活对部分,配合各种 SQL 语句进行处理。

    // db.rawQuery
    Future<List<Map>> _getUserList() async {
      List<Map> list = await db.rawQuery('SELECT * FROM User');
      return list;
    }
    
    // db.query
    Future<List<Map>> _getUserByName(var tableName, var name) async {
      List<Map> list =
          await db.query(tableName, where: 'name = ?', whereArgs: [name]);
      return list;
    }
    

    5. 【删】删除数据

          借助 rawDeletedb.delete 对数据库表进行数据删除,小菜测试删除 id = 0和1 的对应数据,sqflite 内部已处理好,若数据库表不存在也不会报异常。

    // rawDelete
    _deleteRawUserByID(int id) async {
      return await db.transaction((txn) async {
        await txn.rawDelete('DELETE FROM User WHERE id = ${id}');
      });
    }
    
    // db.delete
    _deleteUserByID(var tableName, int id) async {
      return await db.delete(tableName, where: 'id = ?', whereArgs: [id]);
    }
    

    6. 【改】更新数据

          借助 rawUpdatedb.update 对数据库表进行内容数据更新,可根据需求变更固定字段或整条数据。

    // rawUpdate
    _updateRawUser(var userBean) async {
      return await db.transaction((txn) async {
        await txn.rawUpdate('UPDATE User SET address = "${userBean.address}" '
            'WHERE name = "${userBean.name}"');
      });
    }
    
    // db.update
    Future<int> _updateUser(var tableName, var userBean) async {
      return await db.update(tableName, userBean.toMap(),
          where: 'name = ?', whereArgs: [userBean.name]);
    }
    

    7. 删除数据表

          小菜刚接触数据库,没有找到直接删除表的方式,没有类似 drop 的方法,如果有哪位大神了解请多多指导。注:若用如下方式只会删除当前表中所有数据而不会删除表。

    onPressed: () async {
      await db.delete('User');
    }
    

    8. 删除数据库

          删除数据库与创建数据库相对应,直接对路径进行操作。

    FlatButton(
        color: Colors.blue,
        child: Text('删除数据库', style: TextStyle(color: Colors.white)),
        onPressed: () async {
          await deleteDatabase(path);
        })
    

    注意事项

    1. 建议在对数据库表进行增删改查前优先判断数据库是否存在,可统一封装方法以降低异常;
    2. 对于数据库表的增删改查,小菜使用了两种方式:一种是直接 db.增删改查,另一种是 db.transaction 后对回调 raw+增删改查,两种的区别是,第一种使用更便捷,可直接修改整条数据;第二种使用更灵活,可对部分数据字段进行调整,可以看图例中的【更新】结果;
    3. 在使用 db.transaction 对数据库表进行增删改查时要注意 SQL 语句的完整性,包括传递 String 类型参数时要加引号,执行的是一个完整的 SQL 语句。

          数据库的操作灵活多样,小菜刚刚尝试,本篇仅记录一下基本的使用情况,对于更多灵活的方法会继续尝试整理,有问题的地方请大家多多指导。以下是小菜公众号,欢迎前来吐槽~


    公众号.jpg

    相关文章

      网友评论

        本文标题:Flutter 26: 图解关乎 SQL 数据库的二三事 (一)

        本文链接:https://www.haomeiwen.com/subject/xxdjkqtx.html