📜  Flutter数据库概念

📅  最后修改于: 2021-01-02 05:32:08             🧑  作者: Mango

Flutter数据库概念

数据库是有组织的数据集合,它支持数据的存储和处理,并且可以从计算机系统进行电子访问。我们可以将数据组织成行,列,表和索引。它使数据管理变得容易。我们可以在数据库中存储很多东西,例如名称,年龄,图片,图像,文件,pdf等。

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: flutter
  sqflite: any
  path_provider: any
  • sqflite软件包提供了与SQLite数据库进行交互的类和函数。
  • path_provider软件包提供了一些函数来定义数据库在本地系统上的位置,例如TemporaryDirectoryApplicationDocumentsDirectory

步骤2:创建模型类。在此步骤中,我们必须定义创建表以存储信息之前需要存储的数据。下面的代码很容易解释它。

class Book {
  final int id;
  final String title;
  final int price;

  Book({this.id, this.title, this.price});
}

步骤3:打开数据库。在这里,我们需要打开与数据库的连接。它需要两个步骤:

  • 使用getDtabasePath()方法设置数据库的路径,并将其与路径包组合在一起。
  • 使用openDatabase()函数打开数据库。
// It allows to open the database and store the reference.
final Future database = openDatabase(
  join(await getDatabasesPath(), 'book_database.db'),
);

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

final Future 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 toMap() {
    return {
      'id': id,
      'title': title,
      'price': price,
    };
  }
}

Future 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 的查询。
  • 将List 转换为List

您可以查看以下代码来轻松理解它。

// This method retrieves all the books from the books table.
Future> books() async {
  final Database db = await database;

  // Use query for all Books.
  final List> 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 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 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 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> books() async {
    final Database db = await database;

    final List> 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 updateBook(Book book) async {
    final db = await database;
    await db.update(
      'books',
      book.toMap(),
      where: "id = ?",
      whereArgs: [book.id],
    );
  }

  Future 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 toMap() {
    return {
      'id': id,
      'title': title,
      'price': price,
    };
  }
  @override
  String toString() {
    return 'Book{id: $id, title: $title, price: $price}';
  }
}