使用 SQLite


想要在 Flutter 中使用資料庫,SQLite 是選擇之一,可以透過 sqflite 套件來操作 SQLite,這需要在 pubspec.yaml 的 dependencies 加入:

dependencies:
  flutter:
    sdk: flutter

  sqflite: ^1.3.1
  path: ^1.6.2

在一些 Flutter 的 SQLite 文件中,你常會看到結合 path 套件,這不一定需要,因為它只是用來操作路徑時的一個簡便套件,如果你要建立一個 demo.db,不透過 path 的話可以如下:

'${await getDatabasesPath()}/demo.db',

有了 path 的話,可以透過 join 來組合路徑:

join(await getDatabasesPath(), 'demo.db')

getDatabasesPath 用來取得可存放資料庫檔案的路徑,你可以透過 openDatabase 來開啟資料庫,在首次建立資料庫時,可以指定建立表格,例如建立一個 messsages 表格,擁有 idnameemailtext 等欄位:

final database = await openDatabase(
  join(await getDatabasesPath(), 'demo.db'),
  onCreate: (db, version) {
    return db.execute(
      '''CREATE TABLE messages (
           id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
           name TEXT NOT NULL,
           email TEXT NOT NULL,
           text TEXT NOT NULL)'''
    );
  },
  version: 1,
);

若想以 SQL 的方式來操作,可以透過 DataBaserawXXX 等方法,例如新增一筆資料:

await database.rawQuery('INSERT INTO messages(name, email, text) VALUES(?, ?, ?)',
  ['caterpillar', 'caterpillar@openhome.cc', 'Your message is here.']
);

想取得資料的話,可以如下:

List<Map<String, dynamic>> messages =
  await database.rawQuery('SELECT * FROM messages where id = ?', [1]);

更新資料的範例:

var updated = await database.rawUpdate(
  'UPDATE messages SET text = ? WHERE name = ?', 
   ['This is a updated message.', 'caterpillar']
);

刪除資料的例子:

var deleted = await database.rawDelete('DELETE FROM messages WHERE id = ?', [1]);

對於簡單的增刪查改,可以透過 DataBaseinsertdeleteupdatequery 等方法,如此可以不用撰寫 SQL,例如新增資料:

await database.insert(
  'messages',
  {
    name: 'caterpillar',
    email: 'caterpillar@openhome.cc',
    text: 'This is a test!'
  },
  conflictAlgorithm: ConflictAlgorithm.replace,
);

刪除資料:

await database.delete(
  'messages',
  where: "id = ?",
  whereArgs: [1],
);

更新資料:

await db.update(
  'messages',
  dog.toMap(),
  where: "id = ?",
  whereArgs: [`],
);

查詢資料:

List<Map<String, dynamic>> messages = 
  await database.query('messages', where: 'id = ?', whereArgs: [1]);