在APP做了許多操作後,當然不希望辛苦操作完的資料在關閉APP就通通不見了。
今天要一起來看看如何在flutter app中透過建立SQLite的資料庫來保存資料。
好的,那我們就開始吧!
sqflite
和path
套件$ flutter pub add sqflite path
$ flutter pub get
class Dog {
final int id;
final String name;
final int age;
const Dog({
required this.id,
required this.name,
required this.age,
});
}
建立資料庫連結
// WidgetFlutterBinding 用於將flutter framework和flutter引擎連結,確定兩者連結後,準備要透過widget層的方法調用原生api來開啟資料庫
WidgetsFlutterBinding.ensureInitialized();
final database = openDatabase( // 開啟一個資料庫
join(await getDatabasesPath(), 'doggie_database.db'),
);
sqflite
的getDatabasePath()
方法可以取得該資料庫的位置,而doggie_database.db
是該資料庫的檔案名稱。兩者透過path
提供的join
方法連接起來,就是該資料庫的資源位置。
final database = openDatabase(
join(await getDatabasesPath(), 'doggie_database.db'),
onCreate: (db, version) { // 第一次開啟db時,執行以下指令
return db.execute(
'CREATE TABLE dogs(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)', // 創建含有id, name, age欄位的table,名稱為dogs
);
},
version: 1, // 做資料庫版控用
);
Map
形式
class Dog {
final int id;
final String name;
final int age;
const Dog({
required this.id,
required this.name,
required this.age,
});
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
'age': age,
};
}
}
在Dog
class建立toMap
methodinsertDog
function,內部透過db.insert(tableName, data, conflictAlgorithm)
寫入資料
Future<void> insertDog(Dog dog) async {
final db = await database;
await db.insert(
'dogs', // dogs table
dog.toMap(), // 要寫入的資料
conflictAlgorithm: ConflictAlgorithm.replace, // 定義資料衝突規則:若有衝突則覆蓋原先資料
);
}
var fido = const Dog(
id: 0,
name: 'Fido',
age: 35,
); // 建立名為'Fido'的狗的資料
await insertDog(fido); // 使用上述定義的function將狗的資料存進db
selectAllDogs
Future<List<Dog>> queryAllDogs() async {
final db = await database;
final List<Map<String, dynamic>> maps = await db.query('dogs'); // 取得'dogs' table的所有資料
return List.generate(maps.length, (i) {
return Dog(
id: maps[i]['id'],
name: maps[i]['name'],
age: maps[i]['age'],
);
}); // 將所有取得的狗的資料轉換為Dog物件的列表
}
List<Dog> allDogs = await queryAllDogs();
db.rawQuery('SELECT * FROM "table"'); // 使用raw SQL
db.query(
'table', // table 名稱
columns: ['group'], // 要選取的欄位
where: '"group" = ?', // 篩選條件
whereArgs: ['my_group'] // 要求篩選的參數
);
where
和whereArgs
來指定要查詢的目標並更新
Future<void> updateDog(Dog dog) async {
final db = await database;
await db.update(
'dogs', // table名稱
dog.toMap(), // 新的資料
where: 'id = ?', // 查詢的條件:以id查詢
whereArgs: [dog.id], // 該狗狗的id
);
}
fido = Dog(
id: fido.id,
name: fido.name,
age: fido.age + 7, // Fido的年齡有所變化
);
await updateDog(fido); // 依照id找到並更新Fido的資料
where
和whereArgs
作為查詢條件
Future<void> deleteDog(int id) async {
final db = await database;
await db.delete(
'dogs',
where: 'id = ?', // 以id作為查詢條件
whereArgs: [id], // 刪除此id
);
}
await deleteDog(fido.id);
今天看到操作資料庫有以下幾個要點:
final database = openDatabase(
join(await getDatabasesPath(), DB_NAME),
onCreate: (db, version) {
return db.execute(
RAW_SWL,
);
},
version: VERSION_NUMBER,
)
db.insert(tableName, data)
db.query(tableName, column, where, whereArgs)
db.update(tableName, data, where, whereArgs)
db.delete(tableName, where, whereArgs)
成功將我們的資料存進資料庫後並確認重開時可以正常讀取後,我們明天要來對APP進行最後的修整囉~