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