Flutter打开assets内sqlite数据库时出现_TypeError类型不匹配报错
报错根因
你遇到的类型错误来源于两个核心问题:
- 你的
initDb()方法没有显式声明返回值类型,且方法执行结束后没有返回已打开的Database实例,默认返回null,赋值给_db时触发类型不匹配错误 - 你当前的
dbgetter没有做懒加载判断,每次调用都会重新执行初始化逻辑、覆盖旧的数据库实例,属于额外的逻辑问题
修复后的完整代码
import 'dart:async'; import 'dart:io'; import 'dart:typed_data'; import 'package:bankingapp/models/histories.dart'; import 'package:flutter/services.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; class DbHelper { static Database? _db; Future<Database> get db async { // 懒加载逻辑,仅当_db为空时才执行初始化 return _db ??= await initDb(); } // 修复1:显式声明返回类型为Future<Database> Future<Database> initDb() async { var dbDir = await getDatabasesPath(); var dbPath = join(dbDir, "app.db"); // 不需要每次启动覆盖本地数据库可删除这行 await deleteDatabase(dbPath); ByteData data = await rootBundle.load("assets/database/bankingapp.db"); List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); await File(dbPath).writeAsBytes(bytes); var db = await openDatabase(dbPath); // 修复2:显式返回打开后的数据库实例 return db; } Future<List<Histories>> getHistories() async { var dbClient = await db; var result = await dbClient.rawQuery("SELECT * FROM Histories"); return result.map((data) => Histories.fromMap(data)).toList(); } }
额外注意事项
- 请检查
pubspec.yaml中已正确配置assets路径,确保assets/database/bankingapp.db被正常打包到应用安装包内,否则会触发资源加载失败错误 - 如果不需要每次启动应用都重置数据库内容,可以删除
await deleteDatabase(dbPath);这行代码,避免用户本地存储的数据被意外清空
内容的提问来源于stack exchange,提问作者MaybeExpertDBA
相关产品推荐
相关产品推荐

