跳转至

数据持久化

sqflite

import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';

class SqfliteManager {
  final String _tableName = "MC_TEXT";
  late Database db;

  ///创建数据库文件,返回Database。
  Future<Database> initDatabase() async {
    var basePath = await getDatabasesPath();
    String dbPath = join(basePath, 'mic_db.db');
    print(dbPath);
    //打开数据库,创建数据库文件
    Database db = await openDatabase(
      dbPath, version: 1,
      //arg1:创建成功的数据库 arg2:版本
      onCreate: (Database db, int version) async {
        //创建表
        await db.execute(
            'CREATE TABLE $_tableName (id INTEGER PRIMARY KEY, ac_type TEXT, ac_name TEXT, ac_amount INT)');
      },
    );
    return db;
  }

  ///插入数据
  Future<void> insertData(List list) {
    //添加数据 INSERT INTO 表名 VALUES (值1,值2,...)
    // var id1 = _db.rawInsert('INSERT INTO MC_TEXT(name,age) VALUES("hhh",18)');
    // id1.then((value) => print(value));

    ///在事务中插入数据
    return db.transaction((txn) async {
      for (var element in list) {
        String acType = element['ac_type'];
        String acName = element['ac_name'];
        int acAmount = element['ac_amount'];
        txn
            .rawInsert(
                'INSERT INTO $_tableName(ac_type,ac_name,ac_amount) VALUES ("$acType","$acName",$acAmount)')
            .then((value) => print(value));
      }
    });
  }

  ///删除数据
  deleteData(int deleteId) {
    //删除数据 DELETE FROM 表名称 WHERE 列名称 = 值
    db.rawDelete('DELETE FROM $_tableName WHERE name = "hhh"');
    db.rawDelete('DELETE FROM $_tableName WHERE id = $deleteId');
  }

  ///改
  Future<int> updateData() {
    //修改数据 UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
    return db.rawUpdate('UPDATE MC_TEXT SET name = "rmn" WHERE id = 1');
  }



  ///查询数据
  Future selectData() async {
    // Future.wait([
    //   /// 查找所有的分类
    //   Future(() {
    //     db.rawQuery('SELECT ac_type FROM $_tableName').then((value) {
    //       var types = <String>{};
    //       value.forEach((element) {
    //         types.add(element["ac_type"] as String);
    //       });
    //       print("所有分类:$types");
    //       return types;
    //     });
    //   }),
    //   /// 查找所有的账户
    //   Future(() {
    //   }),
    // ]).then((value) {});

    var result = {};
    //查询数据 SELECT 列名称 FROM 表名称
    await db.rawQuery('SELECT * FROM $_tableName').then((items) {
      //数据处理
      for (var element in items) {
        var key = element["ac_type"];
        var lists = [];
        if (result.keys.contains(key)) {
          lists = result[key];
        }
        lists.add(element);
        result[key] = lists;
      }
      print("所有数据:$result");
    });
    return result;
  }

  ///关闭数据库
  closeDb() {
    db.close();
  }

  ///删除表、删除数据库文件
  deleteDb() {
    //删除表
    db.delete('tableName');
    //删除数据库文件
    getDatabasesPath()
        .then((value) => join(value, 'mic_db.db')) //拼接路径
        .then((value) => deleteDatabase(value)); //删库
  }
}

db.query()方法返回的是一个不可修改的List,在取结果时不能直接用接收的变量去指向它,应该重新构建一个List。

解决方法:

_data = data 改为_data = List.from(data) ;

SharedPreferences

使用shared_preferences会和原生通讯,存储键值对。iOS是和NSUserDefault。

  _loadData() async {
    //await
    SharedPreferences prefs = await SharedPreferences.getInstance();
    _markedDates = prefs.getStringList(_markedDatesKey) ?? [];
    await prefs.setStringList(_markedDatesKey, _markedDates); 
    setState(() {});

    //.then
    SharedPreferences.getInstance().then((SharedPreferences prefs) {
      setState(() {
        _counter++;
        prefs.setInt(prefsKey, _counter);
      });
    });
  }