📜  sqfilte 选择颤振 (1)

📅  最后修改于: 2023-12-03 15:20:14.030000             🧑  作者: Mango

介绍

sqflite 是一种用于构建 Flutter 应用的轻量级本地数据库解决方案。 它提供了一个简单的 API,以便在 iOS 和 Android 上执行 SQL 操作,并且具有事务支持和查询辅助函数。

sqflite 不需要任何附加的安装即可使用,并可以使用 Dart 的所有优点,例如 Futures 和 Stream。

安装

pubspec.yaml 文件中添加下面这行代码:

dependencies:
  sqflite: ^<latest_version>

安装最新版本的 sqflite ,运行下面的命令。

flutter packages get
使用
初始化

在应用程序中,需要通过调用 openDatabase 函数创建一个数据库实例。该函数返回一个 Future<Database> ,该类型代表对数据库的引用。

Future<Database> database = openDatabase(
  // Set the path to the database. Note: Using the `join` function from the
  // `path` package is best practice to ensure the path is correctly
  // constructed for each platform.
  join(await getDatabasesPath(), 'doggie_database.db'),
  // When the database is first created, create a table to store dogs.
  onCreate: (db, version) {
    // Run the CREATE TABLE statement on the database.
    return db.execute(
      'CREATE TABLE dogs(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
    );
  },
  // Set the version. This executes the onCreate function and provides a
  // path to perform database upgrades and downgrades.
  version: 1,
);

在这个例子中,我们使用 join 函数来获取设备特定的储存路径,然后在该路径下创建名为 doggie_database.db 的 SQLite 数据库。 我们也指定了 onCreate 函数,该函数将在链接到新数据库时首次运行。 在此例子中,我们创建了一个 dogs 表,用于存储狗的信息。

如果应用程序当前已有一个数据库,则可以传递数据库路径以连接到该数据库。

插入数据
Future<void> insertDog(Dog dog) async {
  final Database db = await database;

  await db.insert(
    'dogs',
    dog.toMap(),
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

在上面的例子中,我们向 dogs 表添加了一条新记录。 该记录的数据由 Dog 对象提供的 toMap 函数生成。 conflictAlgorithm 参数指示 SQLite 在出现冲突时应如何处理。在此示例中,如果记录已经存在,则用新数据替换它。

查询
Future<List<Dog>> dogs() async {
  final Database db = await database;

  final List<Map<String, dynamic>> maps = await db.query('dogs');

  // Convert the List<Map<String, dynamic> into a List<Dog>.
  return List.generate(maps.length, (i) {
    return Dog(
      id: maps[i]['id'],
      name: maps[i]['name'],
      age: maps[i]['age'],
    );
  });
}

在上面的代码片段中,我们查询了所有记录,并将结果转换为 Dog 对象的列表。

更新
Future<void> updateDog(Dog dog) async {
  final db = await database;

  await db.update(
    'dogs',
    dog.toMap(),
    where: 'id = ?',
    whereArgs: [dog.id],
  );
}

在这个例子中,我们通过调用 update 函数来更新数据库中的记录。 where 参数指定了要更新的记录的条件。在这个例子中,我们仅更新 id 与指定 Dogid 相匹配的记录。 whereArgs 参数包含值,该值将替换 where 中的问号占位符。 同样,这种做法可以帮助防止 SQL 注入攻击。

删除
Future<void> deleteDog(int id) async {
  final db = await database;

  await db.delete(
    'dogs',
    where: 'id = ?',
    whereArgs: [id],
  );
}

在这个示例中,我们从数据库中删除了一条记录。 where 参数指定了要删除的记录的条件。在这个例子中,我们仅删除 id 与指定 id 相匹配的记录。 whereArgs 参数包含值,该值将替换 where 中的问号占位符。 同样,这种做法可以帮助防止 SQL 注入攻击。

结论

sqflite 是一款出色的本地数据库解决方案,它提供了一个简单的 API,以便在 iOS 和 Android 上执行 SQL 操作,并且具有事务支持和查询辅助函数。 在 Flutter 应用程序中使用 sqflite 不需要任何附加的安装,它是一个轻量级的库,并且可以使用 Dart 的所有优点,例如 Futures 和 Stream。