開始
使用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
複製程式碼
直接寫sqlite語句,第二個可選引數是資料
第二個的資料是代入到sql語句裡面,sql裡面的?
例子
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
請不要使用上面兩種型別