依賴
sqflite: ^2.3.2 #本地資料儲存
獲取資料庫路徑
// 定義一個非同步函式來獲取資料庫路徑 Future<String> getDatabasePath(String dbName) async { // 獲取應用的文件目錄 final directory = await getApplicationDocumentsDirectory(); // 拼接路徑 final path = join(directory.path, dbName); return path; }
實體
class TbUserData { late String phone; late String name; late String portraits; late String token; // 建構函式 TbUserData({required this.phone, required this.name, required this.portraits, required this.token}); // 將MyData物件轉換為Map Map<String, dynamic> toMap() { return { 'phone': phone, 'name': name, 'portraits': portraits, 'token': token, }; } TbUserData.fromJson(Map<String, dynamic> json) { phone = json['phone']; name = json['name']; portraits = json['portraits']; token = json['token']; } } }
建立
Future<Database> createDatabase() async { // 獲取資料庫路徑 final path = await getDatabasePath('tomato_kid.db'); print("================================================================$path"); // 開啟資料庫 final database = openDatabase( path, version: 1, // 當資料庫第一次被建立時,執行建立表的操作 onCreate: (db, version) { return db.execute( "CREATE TABLE tb_users_login(id INTEGER PRIMARY KEY,phone TEXT,name TEXT, portraits TEXT, token TEXT)", ); }, ); return database; }
新增
Future<void> insertData(TbUserData data, Database db) async { try { // 查詢資料庫中是否已存在相同電話號碼的記錄 List<Map<String, dynamic>> existingRecords = await db.query( 'tb_users_login', where: 'phone = ?', whereArgs: [data.phone], ); if (existingRecords.isNotEmpty) { // 如果存在相同電話號碼的記錄,則替換舊記錄 await db.update( 'tb_users_login', data.toMap(), where: 'phone = ?', whereArgs: [data.phone], ); } else { // 如果不存在相同電話號碼的記錄,則插入新記錄 await db.insert( 'tb_users_login', data.toMap(), conflictAlgorithm: ConflictAlgorithm.replace, ); } } catch (e) { // 列印錯誤資訊 print('Failed to insert data: $e'); } }
刪除
Future<void> deleteData(String phone, Database db) async { // 呼叫delete方法刪除指定id的資料 await db.delete( 'tb_users_login', // where子句用於指定要刪除的資料 where: "phone = ?", whereArgs: [phone], ); }
檢視
Future<List<Map<String, dynamic>>> queryAll(Database db) async { // 查詢所有資料 return await db.query('tb_users_login'); }
Map轉換為MyData物件
Future<List<TbUserData>> getMyDataFromDB(Database db) async { // 獲取所有資料 final List<Map<String, dynamic>> maps = await queryAll(db); // 將Map轉換為MyData物件 return List.generate(maps.length, (i) { return TbUserData( phone: maps[i]['phone'], name: maps[i]['name'], portraits: maps[i]['portraits'], token: maps[i]['token']); }); }