数据持久化¶
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);
});
});
}