Cơ sở dữ liệu(Database) là một tập hợp dữ liệu có tổ chức, hỗ trợ việc lưu trữ và thao tác dữ liệu và được truy cập điện tử từ hệ thống máy tính. Chúng ta có thể tổ chức dữ liệu thành các hàng, cột, bảng và chỉ mục. Nó giúp cho việc quản lý dữ liệu trở nên dễ dàng. Chúng tôi có thể lưu trữ nhiều thứ trong cơ sở dữ liệu, như tên, tuổi, hình ảnh, hình ảnh, tệp, pdf, v.v.

Flutter cung cấp nhiều gói để làm việc với cơ sở dữ liệu. Các gói phổ biến và được sử dụng nhiều nhất là:

  • cơ sở dữ liệu sqflite: Nó cho phép truy cập và thao tác với cơ sở dữ liệu SQLite.
  • Cơ sở dữ liệu Firebase: Nó sẽ cho phép bạn truy cập và thao tác với cơ sở dữ liệu đám mây.

1. Cơ sở dữ liệu SQLite

SQLite là một thư viện phần mềm cơ sở dữ liệu phổ biến cung cấp hệ thống quản lý cơ sở dữ liệu quan hệ để lưu trữ cục bộ / máy khách. Nó là một công cụ cơ sở dữ liệu nhẹ và được kiểm tra theo thời gian và chứa các tính năng như công cụ cơ sở dữ liệu SQL giao dịch độc lập, không cần máy chủ, không cấu hình.

Flutter SDK không hỗ trợ SQLite trực tiếp. Thay vào đó, nó cung cấp một plugin sqflite , thực hiện tất cả các hoạt động trên cơ sở dữ liệu tương tự như thư viện SQLite. Sqflite cung cấp hầu hết các chức năng cốt lõi liên quan đến cơ sở dữ liệu như sau:

  • Nó tạo hoặc mở cơ sở dữ liệu SQLite.
  • Nó có thể thực thi các câu lệnh SQL một cách dễ dàng.
  • Nó cũng cung cấp một phương pháp truy vấn nâng cao để lấy thông tin từ cơ sở dữ liệu SQLite.

Hãy để chúng tôi xem từng bước cách chúng tôi có thể lưu trữ và tìm nạp dữ liệu trong Flutter.

Bước 1: Đầu tiên, tạo một dự án mới trong Android Studio và thêm các phần phụ thuộc vào tệp pubspec.yaml .

dependencies:  
  flutter:  
    sdk: flutter  
  sqflite: any  
  path_provider: any  
  • Gói sqflite cung cấp các lớp và chức năng để tương tác với cơ sở dữ liệu SQLite.
  • Các path_provider gói cung cấp các chức năng để xác định vị trí của cơ sở dữ liệu của bạn trên hệ thống địa phương, chẳng hạn như TemporaryDirectoryApplicationDocumentsDirectory .

Bước 2: Tạo một lớp mô hình. Ở bước này, chúng ta phải xác định dữ liệu cần lưu trữ trước khi tạo bảng để lưu trữ thông tin. Đoạn mã sau đây giải thích nó một cách dễ dàng.

class Book {  
  final int id;  
  final String title;  
  final int price;  
  
  Book({this.id, this.title, this.price});  
}

Bước 3: Mở cơ sở dữ liệu. Tại đây, chúng ta cần mở kết nối với cơ sở dữ liệu. Nó yêu cầu hai bước:

  1. Đặt đường dẫn đến cơ sở dữ liệu bằng cách sử dụng phương thức getDtabasePath () và kết hợp nó với gói đường dẫn.
  2. Sử dụng hàm openDatabase () để mở cơ sở dữ liệu.
// It allows to open the database and store the reference.  
final Future<Database> database = openDatabase(  
  join(await getDatabasesPath(), 'book_database.db'),  
); 

Bước 4: Tạo bảng. Trong bước này, chúng ta phải tạo một bảng lưu trữ thông tin về các cuốn book. Ở đây, chúng ta sẽ tạo một bảng có tên book, trong đó có id, tên bookgiá của book. Chúng được thể hiện dưới dạng ba cột trong bảng book.

final Future<Database> database = openDatabase(  
  join(await getDatabasesPath(), 'book_database.db'),  
  // When you create a database, it also needs to create a table to store books.  
  onCreate: (db, version) {  
    // Run the CREATE TABLE statement.  
    return db.execute(  
      "CREATE TABLE books(id INTEGER PRIMARY KEY, title TEXT, price INTEGER)",  
    );  
  },  
  // Set the version to perform database upgrades and downgrades.  
  version: 1,  
);  

Bước 5: Chèn book vào cơ sở dữ liệu. Ở đây, bạn phải lưu trữ thông tin trên bảng về các cuốn book khác nhau. Chèn một cuốn book vào bảng bao gồm hai bước:

  • Chuyển book thành map
  • Sử dụng phương thức insert()

Đoạn mã sau giải thích nó rõ ràng hơn.

// Update the Book class.  
class Book{  
  final int id,  
  final String title;  
  final int price;  
  
  Book({this.id, this.title, this.price});  
  
  // It converts a Book into a Map. The keys correspond to the names of the columns in the database.  
  Map<String, dynamic> toMap() {  
    return {  
      'id': id,  
      'title': title,  
      'price': price,  
    };  
  }  
}  
  
Future<void> insertBook(Book book) async {  
  final Database db = await database;  
  await db.insert(  
    'books',  
    book.toMap(),  
    conflictAlgorithm: ConflictAlgorithm.replace,  
  );  
}  
  
// Create a Book and add it to the books table.  
final b1 = Book(  
  id: 0,  
  title: 'Let Us C',  
  price: 350,  
);  
  
await insertBook(b1);  

Bước 6: Lấy danh book book. Bây giờ, chúng ta đã lưu trữ book vào cơ sở dữ liệu và bạn có thể sử dụng truy vấn để truy xuất một cuốn book cụ thể hoặc danh book tất cả các cuốn book. Nó bao gồm hai bước:

  • Chạy một truy vấn trả về List<Map>.
  • Chuyển List<Map> thành List<book>.

Bạn có thể xem đoạn code sau để hiểu nó một cách dễ dàng.

// This method retrieves all the books from the books table.  
Future<List<Book>> books() async {  
  final Database db = await database;  
  
  // Use query for all Books.  
  final List<Map<String, dynamic>> maps = await db.query('maps');  
  
  return List.generate(maps.length, (i) {  
    return Book(  
      id: maps[i]['id'],  
      title: maps[i]['title'],  
      price: maps[i]['price'],  
    );  
  });  
}  
  
// It prints all the books.  
print(await books());  

Bước 7: Cập nhật book trong cơ sở dữ liệu. Bạn có thể sử dụng phương thức update () để cập nhật book mà bạn muốn. Nó bao gồm hai bước:

  • Chuyển đổi book thành Bản đồ.
  • Sau đó, sử dụng mệnh đề where để cập nhật book.

Bạn có thể xem đoạn mã sau để hiểu nó.

Future<void> updateBook(Book book) async {  
  final db = await database;  
  
  // Update the given Book.  
  await db.update(  
    'books',  
    book.toMap(),  
    // It ensure the matching id of a Book.  
    where: "id = ?",  
    whereArgs: [book.id],  
  );  
}  
  
// Update b1 price.  
await updateBook(Book(  
  id: 0,  
  title: 'Let Us C',  
  price: 420,  
));  
  
// Print the updated results.  
print(await books());  

Bước 8: Xóa book khỏi cơ sở dữ liệu. Bạn có thể sử dụng phương thức delete () để xóa cơ sở dữ liệu. Đối với điều này, bạn cần tạo một hàm lấy id và xóa cơ sở dữ liệu của id phù hợp.

Future<void> deleteBook(int id) async {  
  final db = await database;  
  
  // This function removes books from the database.  
  await db.delete(  
    'books',  
    where: "id = ?",  
    whereArgs: [id],  
  );  
}  

Hãy cho chúng ta xem mã hoàn chỉnh để hiểu cách chúng tôi có thể tạo tệp cơ sở dữ liệu bằng plugin sqflite. Đối với điều này, hãy tạo một dự án Flutter mới và gói sqflite và đường dẫn vào tệp pubspec.yaml. Tiếp theo, tạo một tệp mới vào thư mục lib và chèn đoạn mã sau vào tệp này. Bây giờ, kết nối cơ sở dữ liệu với giao diện người dùng của bạn và chạy mã.

import 'dart:async';  
  
import 'packprice:path/path.dart';  
import 'packprice:sqflite/sqflite.dart';  
  
void main() async {  
  final database = openDatabase(  
    join(await getDatabasesPath(), 'book_database.db'),  
    onCreate: (db, version) {  
      return db.execute(  
        "CREATE TABLE books(id INTEGER PRIMARY KEY, title TEXT, price INTEGER)",  
      );  
    },  
    version: 1,  
  );  
  
  Future<void> insertBook(Book book) async {  
    // Get a reference to the database.  
    final Database db = await database;  
  
    await db.insert(  
      'books',  
      book.toMap(),  
      conflictAlgorithm: ConflictAlgorithm.replace,  
    );  
  }  
  
  Future<List<Book>> books() async {  
    final Database db = await database;  
  
    final List<Map<String, dynamic>> maps = await db.query('books');  
  
    return List.generate(maps.length, (i) {  
      return Book(  
        id: maps[i]['id'],  
        title: maps[i]['title'],  
        price: maps[i]['price'],  
      );  
    });  
  }  
  
  Future<void> updateBook(Book book) async {  
    final db = await database;  
    await db.update(  
      'books',  
      book.toMap(),  
      where: "id = ?",  
      whereArgs: [book.id],  
    );  
  }  
  
  Future<void> deleteBook(int id) async {  
    final db = await database;  
    await db.delete(  
      'books',  
      where: "id = ?",  
      whereArgs: [id],  
    );  
  }  
  
  var b1 = Book(  
    id: 0,  
    title: 'Let Us C',  
    price: 300,  
  );  
  
  await insertBook(b1);  
  
  print(await books());  
  
  b1 = Book(  
    id: b1.id,  
    title: b1.title,  
    price: b1.price,  
  );  
  await updateBook(b1);  
  
  print(await books());  
  
  await deleteBook(b1.id);  
  
  print(await books());  
}  
  
class Book {  
  final int id;  
  final String title;  
  final int price;  
  
  Book({this.id, this.title, this.price});  
  
  Map<String, dynamic> toMap() {  
    return {  
      'id': id,  
      'title': title,  
      'price': price,  
    };  
  }  
  @override  
  String toString() {  
    return 'Book{id: $id, title: $title, price: $price}';  
  }  
}  

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!