flutter - sqlite資料庫小白入門,看不懂打死我

秀嶽lonelyBoy發表於2019-11-14

開始

使用sqflite操作sqlite

sqflite: ^1.1.7+1
複製程式碼

可以先看官方sqlite教程,我覺得寫的還不錯, 比其他中文版的文章教程好多了(壓根看不下去)。(除了我這篇)

官方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
複製程式碼

flutter - sqlite資料庫小白入門,看不懂打死我
直接寫sqlite語句,第二個可選引數是資料 第二個的資料是代入到sql語句裡面,sql裡面的?

例子

rawInsert(
      'INSERT INTO Test(name) VALUES(?)',
      ['name']
)
複製程式碼

rawInsert、 rawDelete、 rawUpdate、 rawQuery

分別對應增刪改查,那麼新建表,統計資料等等操作怎麼辦?

使用execute。(仔細看你會發現這貨返回值是void,不必慌張,這是正常的)

sqlite語法

如果你不會db語法,沒事,百度或者谷歌學習下。

點選進入 菜鳥教程的sqlite語法

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
請不要使用上面兩種型別

相關連結

sqflite包

相關文章