Flutter-数据库

作者: 节庆007 | 来源:发表于2019-10-08 09:56 被阅读0次

    我们平时开发android或者ios都有比较成熟的高级数据库管理,但是目前flutter暂时没有,所以我们目前数据存储采用的是还是相对原生的sqflite。

    先上工具类:

    import 'package:path/path.dart';
    import 'package:sqflite/sqflite.dart';
    import 'package:sqflite/sqlite_api.dart';
    import 'package:yxk_app/utils/data_utils.dart';
    import 'package:yxk_app/utils/log_utils.dart';
    
    import 'db_bean_base.dart';
    
    /// 数据库存储
    class DbUtils {
      DbUtils._();
    
      // 数据库路径
      String databasesPath;
      // 数据库
      Database database;
      // 数据库版本
      int dbVersion = 1;
    
      static DbUtils dbUtils;
    
      static DbUtils getInstance() {
        if (null == dbUtils) dbUtils = DbUtils._();
        return dbUtils;
      }
    
      /// 打开数据库
      Future openDb(String dbName) async {
        // 如果数据库路径不存在,赋值
        if (null == databasesPath || databasesPath.isEmpty)
          databasesPath = await getDatabasesPath();
    
        // 如果数据库存在,而且数据库没有关闭,先关闭数据库
        closeDb();
    
        database = await openDatabase(join(databasesPath, dbName + '.db'),
            version: dbVersion, onCreate: (Database db, int version) async {
          // 用户表
          await db.execute(
              'CREATE TABLE UserInfo (userName TEXT PRIMARY KEY, nickName TEXT, headImgUrl TEXT, phone TEXT, idCard TEXT, telephone TEXT, emailYear TEXT, birthday TEXT, year TEXT, bankCard TEXT, province TEXT, city TEXT, county TEXT, town TEXT, address TEXT, sex INTEGER, status INTEGER, poorNumberCard TEXT, openBank TEXT, relationUser TEXT, relationName TEXT, appRole TEXT, createTime TEXT, updateTime Text)');
          // 收货地址信息表
          await db.execute(
              'CREATE TABLE PickInfo (id TEXT PRIMARY KEY, userName TEXT, tel TEXT, receiver TEXT, province TEXT, city TEXT, county TEXT, address TEXT, status TEXT)');
        }, onUpgrade: (Database db, int oldVersion, int newVersion) {
          // 版本更新可能牵扯到重新插入表、删除表、表中字段变更-具体更新相关sql语句进行操作
        });
      }
    
      // 插入数据
      Future<void> insertItem<T extends DbBaseBean>(T t) async {
        if (null == database || !database.isOpen) return;
        Log.d("开始插入数据:${t.toJson()}");
    
        // 插入操作
        await database.insert(
          t.getTableName(),
          t.toJson(),
          conflictAlgorithm: ConflictAlgorithm.replace,
        );
      }
    
      /// 删除数据
      Future<void> deleteItem<T extends DbBaseBean>(T t,
          {String key, String value}) async {
        if (null == database || !database.isOpen) return null;
    
        // 删除表
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
          await database.delete(t.getTableName());
        } else {
          // 删除数据
          await database.delete(
            t.getTableName(),
            where: (key + " = ?"),
            whereArgs: [value],
          );
        }
      }
    
      /// 更新数据
      Future<void> updateItem<T extends DbBaseBean>(
          T t, String key, String value) async {
        if (null == database || !database.isOpen) return null;
    
        // 更新数据
        await database.update(
          t.getTableName(),
          t.toJson(),
          where: (key + " = ?"),
          whereArgs: [value],
        );
      }
    
      // 查询数据
      Future<List<T>> queryItems<T extends DbBaseBean>(T t,
          {String key = "", String value = ""}) async {
        if (null == database || !database.isOpen) return null;
    
        List<Map<String, dynamic>> maps = List();
    
        // 列表数据
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
          maps = await database.query(t.getTableName());
        } else {
          maps = await database.query(
            t.getTableName(),
            where: (key + " = ?"),
            whereArgs: [value],
          );
        }
    
        // map转换为List集合
        return List.generate(maps.length, (i) {
          return t.fromJson(maps[i]);
        });
      }
    
      /// 关闭数据库
      closeDb() async {
        // 如果数据库存在,而且数据库没有关闭,先关闭数据库
        if (null != database && database.isOpen) {
          await database.close();
          database = null;
        }
      }
    
      /// 删除数据库
      deleteDb(String dbName) async {
        // 如果数据库路径不存在,赋值
        if (null == databasesPath || databasesPath.isEmpty)
          databasesPath = await getDatabasesPath();
    
        await deleteDatabase(join(databasesPath, dbName + '.db'));
      }
    }
    

    我们里面引入一个DbBaseBean,主要是为了便于采用泛型,统一工具类调用方法。
    使用方法:所有需要存储的表对应的实体类继承该对象。

    // 基础bean,工具类操作依赖此bean
    abstract class DbBaseBean {
      /// 实体转换Map
      Map<String, dynamic> toJson();
    
      /// map转实体
      DbBaseBean fromJson(Map<String, dynamic> map);
    
      /// 关联表名称
      String getTableName();
    }
    

    使用说明
    1.我们的方法大多都是async方法,所以调用的时候一定要加上await
    2.打开数据库、用户切换:
    假如有两个用户,用户号分别是"周杰伦"、"陈奕迅"
    需要切换的时候直接调用

    await DbUtils.getInstance().openDb("周杰伦");
    

    3.工具类中增删改查都有,只需要正常操作就可以了。
    表关联实体类的创建:

    • 加入相关引用
      dependencies:
      json_annotation: ^3.0.0
      analyzer: 0.38.2
      dev_dependencies:
      flutter_test:
      sdk: flutter
      build_runner: ^1.7.0
      json_serializable: ^3.2.0
    • 打开网页对数据进行序列化生成.g文件
      https://caijinglong.github.io/json2dart/index.html
    • 执行命令,生成需要的文件
      Terminal运行:fflutter packages pub run build_runner build --delete-conflicting-outputs(删除后重建)

    相关文章

      网友评论

        本文标题:Flutter-数据库

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