想要在 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
表格,擁有 id
、name
、email
、text
等欄位:
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 的方式來操作,可以透過 DataBase
的 rawXXX
等方法,例如新增一筆資料:
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]);
對於簡單的增刪查改,可以透過 DataBase
的 insert
、delete
、update
、query
等方法,如此可以不用撰寫 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]);