前言
flutter的存储有一下几种:
1. shared_preferences
官方提供的存储方式,可以使用“key“ - “value”的方式记入用户不可见的手机存储位置。是一种适用于量小的存储方式。
2. 写入文件
通过path_provider将内容写入文件,适用于对于图片,视频等比较量大的内容存储。
3. 数据库
可以进行增删改查,适用于量大,或者复杂查询方式的需求。
使用
1、SQLite
SQLite是遵守ACID的关系数据库管理系统。与许多其它数据库管理系统不同,SQLite不是一客户端/服务器结构的数据库引擎,而是被集成在用户程序中。
SQLite遵守ACID,实现了大多数SQL标准。它使用动态的、弱类型的SQL语法。它作为嵌入式数据库,是应用程序,如网页浏览器,在本地/客户端存储数据的常见选择。它可能是最广泛部署的数据库引擎,因为它正在被一些流行的浏览器、操作系统、嵌入式系统所使用。同时,它有许多程序设计语言的语言绑定。
总结下来,其特点有
-
不需要单独的服务器或操作系统
-
SQLite不需要配置,即不需要手动安装和管理
-
存储在一个单一的跨平台的磁盘文件
-
不需要外部依赖,完全自给自足
-
轻量级
2、sqflite是什么
sqflite是用于Flutter的SQLite插件,支持iOS、Android、MacOS
-
支持事务和批量操作
-
程序打开期间,自动化版本管理
-
增删改查的帮助程序
-
在iOS和Android后台线程中执行DB操作
saflite有五种数据类型:NULL,INTEGER,REAL,TEXT,BLOB
-
NULL,默认值,值不存在
-
INTEGER,即int类型,值的范围是-2^63 到 2^63 - 1
-
REAL,即num类型,即int和double类型
-
TEXT,即String类型
-
BLOB,即Uint8List类型,虽然能够存储List< int >,但官方并不建议,因为转化比较慢
3、sqflite怎么用
- 数据库操作
1、数据库的创建
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
String databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'db_name.db');
Database database = await openDatabase( path,
version: VERSION,
onCreate: onCreate,
onUpgrade: (Database db, int oldVersion, int newVersion) async {
// 数据库升级
},
);
//具体表的创建onCreate(Database db, int version) async { await db.execute( "CREATE TABLE Test (" "id INTEGER PRIMARY KEY autoincrement, " .... "historyMsgList TEXT)" ); }
2、数据库的删除
await deleteDatabase(path);
3、数据库关闭
await database.close();
4、数据库升级
在某些时候,表的结构要更新,增加列或者减少,这时候可以进行数据库的升级,使用onUpgrade,可以看到,字段中比起创建多了oldVersion和newVersion,这里需要newVersion比原version大。
- 表操作
1、添加表
添加表有几种方法:
//直接写入SQL语句:
await database.execute(
'CREATE TABLE Test (id INTEGER PRIMARY KEY, name TEXT, value INTEGER, num REAL)'
);
//通过引号分割
await db.execute( "CREATE TABLE Test (" "id INTEGER PRIMARY KEY autoincrement, " .... "historyMsgList TEXT)");
2、删除表
database.execute('DROP table Test');
3、清空表
database.execute('DELETE FROM test');
4、重命名
database.execute('ALTER TABLE test RENAME TO test_1');
5、添加字段
database.execute('ALTER TABLE test ADD age integer');
6、删除字段
database.execute('ALTER TABLE test DROP COLUMN age');
复制代码
7、修改字段类型
database.execute('ALTER TABLE test ALTER COLUMN value TEXT');
- 数据的增删改查
1、添加数据
//以map方式
int id = await database.insert(
‘Test’,
{'name': 'Civet', 'value': '18', 'num': '456.7'}
);
//以sql语句方式
int id = await database.rawInsert(
'INSERT INTO test(name, value, num) VALUES("Civet", 18, 456.7)'
);
//以数据model格式
await _db.insert(
"Test",
TestType.toMap(), //插入类型的string
conflictAlgorithm: ConflictAlgorithm.fail
);
class TestType { int id;
String name; String value; String num;
User(this.name, this.value, this.num, {this.id});
User.fromJson(Map<String,dynamic> json){
id = json['id'];
account = json['name']; pwd = json['value']; name = json['num'];
}
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name, 'value': value, 'num': num,
};
}
}
2、查询数据
//参数形式
List<Map<String, dynamic>> result = await database.query(
‘test’,
distinct: true, // 是否是独特的,即是否不让重复
columns: ['name','value'], // 需要查询的列
where: 'age > ?', // 查询条件
whereArgs: [16], // 查询条件参数
groupBy: 'name', // 按列分组
having: 'count(name) < 2', // 给分组设置条件
orderBy: 'name asc', // 按列排序 asc/desc
limit: 5, // 限制查询结果数量
offset: 2, // 跳过几条数据
);
List<Map<String, dynamic>> result = await _db.query('shoe',
where: ' id > ? and name = ?',
whereArgs: [ 2, "Civet"], orderBy: 'id ASC'
);
if (result.isEmpty){
print("查询结果为空");
}else{
print(result);
}//对全表做查询
List<Map> list = await database.rawQuery('SELECT * FROM Test');
3、删除数据
删除数据和查询数据的方式一样,只是方法不同
int count = await database.delete(
'test',
where: 'name = ?',
whereArgs: ['Civet']
);
4、修改数据
await database.update(
"user",
testType.toMap(),
where: "id = ?",
whereArgs: [user.id]
);