.NET MAUI安卓应用SQLite数据库读写异常求助
.NET MAUI SQLite 数据集合为空排查建议
1. 验证数据库文件与种子数据状态
- 定位
FileSystem.AppDataDirectory的实际物理路径:Windows路径通常为C:\Users\<用户名>\AppData\Local\<应用包名>,Android在应用私有存储目录,iOS在沙盒路径。手动确认数据库文件是否存在 - 使用SQLite可视化工具(如DB Browser for SQLite)打开数据库文件,检查
Exercises表是否存在,以及种子数据是否成功写入 - 在种子数据写入代码后添加断点或日志,确认
InsertAsync/InsertAllAsync的返回值是否匹配预期插入行数(例如插入3条数据应返回3),排查是否有异常中断写入流程
2. 核查数据库延迟初始化逻辑
- 确认
Lazy<SQLiteAsyncConnection>的初始化逻辑,检查连接字符串中的路径是否与Constants类定义的路径一致 - 验证获取数据库连接的方法(如
GetConnection()),确保每次调用都返回有效实例,且已通过await _connection.CreateTableAsync<Exercise>()完成表创建 - 排查时序问题:确保种子数据写入和查询操作都在
CreateTableAsync执行完成后触发,避免表未创建时执行查询
3. 检查GetExercisesAsync()查询逻辑
- 确认查询语句正确性:例如是否为
await _database.Table<Exercise>().ToListAsync();,排查是否误加过滤条件(如Where(x => x.IsActive == false))导致无数据返回 - 在方法内部添加断点或日志,直接查看查询返回的列表是否为空。若查询结果为空,问题出在数据库层;若查询有数据但绑定后为空,需再次确认绑定逻辑(即使你认为绑定无误)
- 为方法添加
try-catch块捕获异常,排查是否存在SQLite错误(如表名与实体类名称不匹配、字段类型不兼容)
4. 验证DI与ViewModel初始化
- 确认ViewModel通过DI注入
CalisthenicsTrackerDatabase实例,而非手动创建新实例(手动创建的实例可能使用不同数据库路径) - 检查
Exercises集合类型:若使用ObservableCollection<Exercise>,确保查询后通过AddRange添加数据,或在重新赋值时触发INotifyPropertyChanged通知 - 确认
Exercises属性正确实现INotifyPropertyChanged,或使用CommunityToolkit.Mvvm的[ObservableProperty]特性
5. 排查路径与权限问题
- 检查
Constants类中的路径拼接逻辑:例如是否为Path.Combine(FileSystem.AppDataDirectory, "CalisthenicsTracker.db3"),避免文件名拼写错误(如遗漏.db3后缀) - 确认应用对
AppDataDirectory的读写权限:虽然该目录为应用私有目录,权限通常默认开放,但仍需排除平台特殊权限限制(如Android 13+的存储权限配置)
内容的提问来源于stack exchange,提问作者Evan Montano
相关产品推荐
相关产品推荐

