使用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
複製代碼
直接寫sqlite語句,第二個可選參數是數據 第二個的數據是代入到sql語句裏面,sql裏面的
?
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
請不要使用上面兩種類型