flutter - sqlite数据库小白入门,看不懂打死我
开始
使用sqflite操作sqlite
sqflite: ^1.1.7+1
可以先看官方sqlite教程,我觉得写的还不错, 比其他中文版的文章教程好多了(压根看不下去)。(除了我这篇)
初始化db
使用openDatabase
初始化
openDatabase语法
Future<Database> openDatabase(String path, {int version, FutureOr<void> Function(Database) onConfigure, FutureOr<void> Function(Database, int) onCreate, FutureOr<void> Function(Database, int, int) onUpgrade, FutureOr<void> Function(Database, int, int) onDowngrade, FutureOr<void> Function(Database) onOpen, bool readOnly = false, bool singleInstance = true})
初始化之前需要先打开数据库
1、打开数据库
penDatabase(
join(await getDatabasesPath(), '<数据库名称>.db'),
)
2. 新建表
默认开始是没有表的,如果直接新建表那么需要自己搞一个表那么需要判断表是否存在。
但是sqflite
有onCreate钩子,首次创建数据库时,就会执行。
openDatabase(
join(await getDatabasesPath(), '<数据库名称>.db'),
onCreate: (Database db, int version) async{
// 新建表
db.execute(sql语法);
},
);
3. 添加版本
openDatabase(
join(await getDatabasesPath(), '<数据库名称>.db'),
onCreate: (Database db, int version) async{
// 新建表
db.execute(sql语法);
},
// 版本
version: 1,
);
版本的作用是,当版本修改之后onCreate
才会执行。
代码
import 'dart:io';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
String createSql = '''
CREATE TABLE <表名称> (
id INTEGER,
name STRING,
);
''';
Database db = await openDatabase(
join(await getDatabasesPath(), '<数据库名称>.db'),
onCreate: (Database db, int version) async{
// 新建表
db.execute(createSql);
},
version: 1,
);
这样就可以拿db使用操作数据库
操作数据库
原生操作(以raw开头),和更适合flutter的操作(适不适合不知道,但是是为了它打造的)
sqflite里面有一个DatabaseExecutor抽象类,我把所有的操作列出来
// 这部分是原生操作表(raw)
execute
rawInsert
rawDelete
rawUpdate
rawQuery
// 这部分是dart操作表方法
insert
query
update
delete
原生操作表(raw)
方法
execute
rawInsert
rawDelete
rawUpdate
rawQuery

?
例子
rawInsert(
'INSERT INTO Test(name) VALUES(?)',
['name']
)
rawInsert、 rawDelete、 rawUpdate、 rawQuery
分别对应增删改查,那么新建表,统计数据等等操作怎么办?
使用execute。(仔细看你会发现这货返回值是void,不必慌张,这是正常的)sqlite语法
如果你不会db语法,没事,百度或者谷歌学习下。
dart操作表
方法
insert
query
update
delete
例子
1. 添加
insert(
'<表名>',
{
"<字段名称>": '<值>'
},
conflictAlgorithm: ConflictAlgorithm.replace,
);
2.查询
- 1.1
db.query('<表名>')
- 1.2
db.query('<表名>', columns: ['字段1', '字段2'], where: '"字段名称" = ?', whereArgs: [字段值]);
可选参数
{
bool distinct,
List<String> columns,
String where,
List<dynamic> whereArgs,
String groupBy,
String having,
String orderBy,
int limit,
int offset
}
3.更变
update(
'<表名>',
// 条件
where: "id = ?",
// 值
whereArgs: [id],
);
4.删除
delete(
'<表名>',
// 条件
where: "id = ?",
// 值
whereArgs: [id],
);
事务
await database.transaction((db) async {
await db.操作1
await db.操作2
// 只能使用内部的db参数操作
})
批量操作
batch = db.batch();
batch.insert('Test', {'name': 'item'});
batch.update('Test', {'name': 'new_item'}, where: 'name = ?', whereArgs: ['item']);
batch.delete('Test', where: 'name = ?', whereArgs: ['item']);
等等
results = await batch.commit();
如果执行的全部是execute
,或者不需要知道执行的结果, 那么commit
可以加一个 noResult: true
await batch.commit(noResult: true);
批量操作也有事务的味道,有一个失败,那么相当于从未执行过那几个操作。不过也提供了一个作死的操作,可以忽略失败的,其他的操作结果保留,不会回滚。
commit(continueOnError: true);
碎碎念:(个人觉得批量操作不应该放到事务里面)
关闭
关闭也很重要,记得释放魔法,不然手机可能顶不住。
这个可不分原生和dart语法了,我们已经脱离操作表的领域啦
await database.close();
可以把关闭写到dispose钩子里
@override
void dispose(){
database.close();
super.dispose();
}
如果多个界面使用,不需要关闭(应用关闭会自动释放)
字段不支持的类型
DateTime
bool
请不要使用上面两种类型
相关链接
转载自:https://juejin.cn/post/6844903996923052040