使用sqflite操做sqlitehtml
sqflite: ^1.1.7+1
复制代码
能够先看官方sqlite教程,我以为写的还不错, 比其余中文版的文章教程好多了(压根看不下去)。(除了我这篇)sql
官方sqlite教程数据库
使用openDatabase
初始化bash
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})
async
初始化以前须要先打开数据库ide
penDatabase(
join(await getDatabasesPath(), '<数据库名称>.db'),
)
复制代码
默认开始是没有表的,若是直接新建表那么须要本身搞一个表那么须要判断表是否存在。学习
可是sqflite
有onCreate钩子,首次建立数据库时,就会执行。ui
openDatabase(
join(await getDatabasesPath(), '<数据库名称>.db'),
onCreate: (Database db, int version) async{
// 新建表
db.execute(sql语法);
},
);
复制代码
openDatabase(
join(await getDatabasesPath(), '<数据库名称>.db'),
onCreate: (Database db, int version) async{
// 新建表
db.execute(sql语法);
},
// 版本
version: 1,
);
复制代码
版本的做用是,当版本修改以后onCreate
才会执行。spa
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使用操做数据库3d
原生操做(以raw开头),和更适合flutter的操做(适不适合不知道,可是是为了它打造的)
sqflite里面有一个DatabaseExecutor抽象类,我把全部的操做列出来
// 这部分是原生操做表(raw)
execute
rawInsert
rawDelete
rawUpdate
rawQuery
// 这部分是dart操做表方法
insert
query
update
delete
复制代码
execute
rawInsert
rawDelete
rawUpdate
rawQuery
复制代码
?
rawInsert(
'INSERT INTO Test(name) VALUES(?)',
['name']
)
复制代码
rawInsert、 rawDelete、 rawUpdate、 rawQuery
分别对应增删改查,那么新建表,统计数据等等操做怎么办?
使用execute。 (仔细看你会发现这货返回值是void,没必要慌张,这是正常的)若是你不会db语法,没事,百度或者谷歌学习下。
insert
query
update
delete
复制代码
1. 添加
insert(
'<表名>',
{
"<字段名称>": '<值>'
},
conflictAlgorithm: ConflictAlgorithm.replace,
);
复制代码
2.查询
db.query('<表名>')
复制代码
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
请不要使用上面两种类型