Flutter数据库概念

数据库是有组织的数据收集, 它支持数据的存储和处理, 并可以从计算机系统进行电子访问。我们可以将数据组织成行, 列, 表和索引。它使数据管理变得容易。我们可以在数据库中存储很多东西, 例如名称, 年龄, 图片, 图像, 文件, pdf等。
【Flutter数据库概念】Flutter提供了许多与数据库一起使用的软件包。最常用和最受欢迎的软件包是:

  • sqflite数据库:它允许访问和操作SQLite数据库。
  • Firebase数据库:它将使你能够访问和操作云数据库。
SQLite数据库
SQLite是一种流行的数据库软件库, 为本地/客户端存储提供了关系数据库管理系统。它是一个轻量级且经过时间考验的数据库引擎, 并包含诸如自包含, 无服务器, 零配置, 事务型SQL数据库引擎的功能。
Flutter SDK不直接支持SQLite。相反, 它提供了一个插件sqflite, 该插件对数据库执行所有操作, 类似于SQLite库。 sqflite提供了与数据库相关的大多数核心功能, 如下所示:
  • 它创建或打开SQLite数据库。
  • 它可以轻松执行SQL语句。
  • 它还提供了一种高级查询方法, 可从SQLite数据库获取信息。
让我们逐步了解如何在Flutter中存储和获取数据。
步骤1:首先, 在Android Studio中创建一个新项目, 并将依赖项添加到pubspec.yaml文件中。
dependencies:flutter:sdk: fluttersqflite: anypath_provider: any

  • sqflite软件包提供了与SQLite数据库进行交互的类和函数。
  • path_provider软件包提供了一些函数来定义数据库在本地系统上的位置, 例如TemporaryDirectory和ApplicationDocumentsDirectory。
步骤2:创建模型类。在此步骤中, 我们必须定义创建表以存储信息之前需要存储的数据。下面的代码很容易解释它。
class Book {final int id; final String title; final int price; Book({this.id, this.title, this.price}); }

步骤3:打开数据库。在这里, 我们需要打开与数据库的连接。它需要两个步骤:
  1. 使用getDtabasePath()方法设置数据库的路径, 并将其与路径包组合在一起。
  2. 使用openDatabase()函数打开数据库。
// It allows to open the database and store the reference.final Future< Database> database = openDatabase(join(await getDatabasesPath(), 'book_database.db'), );

步骤4:创建表。在这一步中, 我们必须创建一个表来存储有关书籍的信息。在这里, 我们将创建一个名为books的表, 其中包含这些书的ID, 标题和价格。它们在书表中表示为三列。
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, );

步骤5:将一本书插入数据库。在这里, 你必须在桌上存储有关各种书籍的信息。将书插入表中涉及两个步骤:
  • 将书转换成地图
  • 使用insert()方法
以下代码对其进行了更清晰的说明。
// 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);

步骤6:检索书籍清单。现在, 我们已经将该书存储到数据库中, 你可以使用查询来检索特定书或所有书的列表。它涉及两个步骤:
  • 运行返回List < Map> 的查询。
  • 将List < Map> 转换为List < Book> 。
你可以查看以下代码来轻松理解它。
// 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());

步骤7:在数据库中更新一本书。你可以使用update()方法来更新所需的书。它涉及两个步骤:
  • 将Book转换为地图。
  • 然后, 使用where子句更新本书。
你可以查看以下代码来理解它。
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());

步骤8:从数据库中删除一本书。你可以使用delete()方法删除数据库。为此, 你需要制作一个具有ID的函数, 并删除匹配ID的数据库。
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], ); }

让我们看完整的代码, 以了解如何使用sqflite插件创建数据库文件。为此, 创建一个新的Flutter项目, 并将sqflite和path包添加到pubspec.yaml文件中。接下来, 在lib文件夹中创建一个新文件, 并在该文件中插入以下代码。现在, 将数据库与你的UI连接并运行代码。
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, }; }@overrideString toString() {return 'Book{id: $id, title: $title, price: $price}'; }}

    推荐阅读