Bài 11. Lưu trữ cục bộ và dịch vụ đám mây

Ứng dụng cần nhớ dữ liệu khi tắt mở lại. Bài này giới thiệu các cách lưu trữ: shared_preferences cho cài đặt, SQLite/Drift cho dữ liệu có cấu trúc, lưu trữ bảo mật cho token, và kết nối Firebase/Supabase.

50 phútTrung cấp
Bạn sẽ học được
  • Lưu cài đặt bằng shared_preferences
  • Lưu dữ liệu bảng bằng sqflite
  • Lưu token an toàn
  • Biết lựa chọn backend đám mây
Thuật ngữ cần biết
Key-value
Lưu cặp khóa – giá trị đơn giản.
SQLite
CSDL quan hệ nhúng trong ứng dụng.
Keychain/Keystore
Kho bảo mật của iOS/Android.
BaaS
Backend as a Service: Firebase, Supabase.

Khái niệm và lý thuyết

Nhu cầuGiải pháp
Cài đặt, cờ đã xem giới thiệushared_preferences
Danh sách ghi chú, đơn hàng ngoại tuyếnsqflite, Drift (SQLite có kiểu)
Token, mật khẩuflutter_secure_storage
Đồng bộ nhiều thiết bị, đăng nhậpFirebase, Supabase

Mọi thao tác lưu trữ đều bất đồng bộ (trả về Future) vì đọc ghi đĩa có thể chậm. Nguyên tắc bảo mật: không bao giờ lưu mật khẩu hay token trong shared_preferences vì đó là tệp văn bản thường.

shared_preferences

flutter pub add shared_preferences
final prefs = SharedPreferencesAsync();
await prefs.setBool('cheDoToi', true);
final toi = await prefs.getBool('cheDoToi') ?? false;

SQLite với sqflite

flutter pub add sqflite path
final db = await openDatabase(
  join(await getDatabasesPath(), 'ghichu.db'),
  version: 1,
  onCreate: (db, v) => db.execute(
    'CREATE TABLE ghichu(id INTEGER PRIMARY KEY AUTOINCREMENT, tieuDe TEXT, noiDung TEXT)'),
);
await db.insert('ghichu', {'tieuDe': 'Học Flutter', 'noiDung': 'Bài 11'});
final ds = await db.query('ghichu', orderBy: 'id DESC');
await db.update('ghichu', {'tieuDe': 'Đã học'}, where: 'id = ?', whereArgs: [1]);
await db.delete('ghichu', where: 'id = ?', whereArgs: [1]);

Luôn dùng whereArgs thay vì nối chuỗi để tránh lỗi SQL injection.

Lưu token an toàn

const storage = FlutterSecureStorage();
await storage.write(key: 'token', value: token);
final t = await storage.read(key: 'token');

Backend đám mây

Firebase (Google): Authentication, Cloud Firestore, Storage, Cloud Messaging; cấu hình bằng flutterfire configure. Supabase: mã nguồn mở, dùng PostgreSQL, có gói supabase_flutter, hợp với người đã biết SQL. Cả hai đều có gói miễn phí đủ cho đồ án sinh viên.

Mẹo hay

Gói các thao tác CSDL vào một lớp GhiChuRepository; giao diện chỉ gọi repository, sau này đổi SQLite sang Supabase không phải sửa giao diện.

Lưu ý

Khi đổi cấu trúc bảng, tăng version và viết onUpgrade; nếu không, người dùng bản cũ sẽ bị lỗi vì bảng thiếu cột.

Thực hành
  1. Lưu lựa chọn chế độ tối bằng shared_preferences, mở lại ứng dụng vẫn giữ.
  2. Làm ứng dụng ghi chú: thêm, sửa, xóa, liệt kê bằng sqflite.
  3. Tách code CSDL vào lớp repository.
  4. Tìm hiểu và tạo dự án Firebase hoặc Supabase thử đăng nhập email.
Tóm tắt bài học
  • shared_preferences cho cài đặt nhỏ.
  • SQLite cho dữ liệu có cấu trúc ngoại tuyến.
  • flutter_secure_storage cho dữ liệu nhạy cảm.
  • Firebase/Supabase cho đồng bộ và đăng nhập.