flutter本地資料儲存 sqflite

鲤斌發表於2024-03-20
依賴
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']);
  });
}

相關文章