MST
星途 面试题库

面试题:Flutter中SQLite数据的复杂查询与事务处理

假设在Flutter应用的SQLite数据库中有一个'users'表,包含'id'、'name'、'age'和'email'字段。现在需要编写代码实现以下功能:查询年龄大于30岁且邮箱地址包含'example.com'的用户,并将这些用户的名字更新为大写形式,同时要保证这两个操作在一个事务中执行,以确保数据的一致性。请给出完整的代码实现及详细注释。
31.0万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试

以下是在Flutter中使用sqflite库实现上述功能的代码:

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

Future<void> updateUsers() async {
  // 数据库路径
  final databasePath = await getDatabasesPath();
  final path = join(databasePath, 'your_database.db');

  // 打开数据库
  final database = await openDatabase(
    path,
    version: 1,
    onCreate: (Database db, int version) async {
      // 创建users表
      await db.execute('''
        CREATE TABLE users (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          name TEXT,
          age INTEGER,
          email TEXT
        )
      ''');
    },
  );

  // 开启事务
  await database.transaction((txn) async {
    // 查询年龄大于30岁且邮箱地址包含'example.com'的用户
    final results = await txn.query(
      'users',
      where: 'age >? AND email LIKE?',
      whereArgs: [30, '%example.com%'],
    );

    // 更新查询到的用户名字为大写形式
    for (var result in results) {
      final id = result['id'];
      final newName = (result['name'] as String).toUpperCase();
      await txn.update(
        'users',
        {'name': newName},
        where: 'id =?',
        whereArgs: [id],
      );
    }
  });

  // 关闭数据库
  await database.close();
}

代码解释

  1. 导入必要的库sqflite用于SQLite数据库操作,path用于处理文件路径。
  2. 获取数据库路径并打开数据库
    • getDatabasesPath获取应用数据库的存储路径。
    • join函数拼接数据库文件名和路径。
    • openDatabase打开数据库,如果数据库不存在则创建,并在首次创建时执行onCreate回调创建users表。
  3. 事务处理
    • database.transaction开启一个事务块,保证内部操作的原子性。
    • 在事务块内,首先使用txn.query查询满足条件的用户。where子句指定查询条件,whereArgs用于替换占位符,防止SQL注入。
    • 遍历查询结果,将每个用户的名字转换为大写,并使用txn.update更新到数据库中。
  4. 关闭数据库:操作完成后关闭数据库连接,释放资源。