.NET MAUI中SQLite数据获取报错:索引超出范围
解决测验应用中SQLite数据加载导致的索引越界问题
核心修复步骤
等待异步数据加载完成再访问集合
异步加载数据库数据时必须用await确保数据加载完成后再操作集合,同时注意集合索引从0开始(不是数据库里的1):public async Task InitializeQuizAsync() { // 先加载所有题目及对应答案 Questions = await LoadQuestionsWithAnswersAsync(); // 检查集合是否有数据,再设置当前题目 if (Questions?.Count > 0) { _currentQuestionIndex = 0; currentQuestion = Questions[_currentQuestionIndex]; } else { // 处理无数据的情况,比如显示"暂无题目"提示 } }完善数据加载逻辑,给Question的Answers属性赋值
加载题目时要关联查询对应的答案,确保每个Question对象的Answers属性被正确填充:private async Task<List<Question>> LoadQuestionsWithAnswersAsync() { // 先查询所有题目 var questions = await _dbConnection.QueryAsync<Question>("SELECT * FROM Question"); // 查询所有答案 var allAnswers = await _dbConnection.QueryAsync<Answer>("SELECT * FROM Answer"); // 为每个题目匹配对应的答案 foreach (var question in questions) { question.Answers = allAnswers.Where(a => a.question_id == question.question_id).ToList(); } return questions; }添加集合有效性检查
在访问集合索引前,必须先确认集合不为null且有元素,避免越界:// 在设置currentQuestion前先检查 if (Questions == null || Questions.Count == 0) { return; // 或者处理无数据场景 }
错误原因说明
- 异步加载未等待:如果直接调用异步加载方法但不使用
await,代码会跳过等待直接执行后续逻辑,此时Questions还是空集合或null,访问索引必然触发越界错误。 - 索引使用错误:C#集合的索引从0开始,你之前设置
_currentQuestionIndex = 1,哪怕数据库里有1条题目,索引1也超出了集合范围(有效索引只有0)。 - Answers属性未赋值:虽然这次错误不是直接由此引发,但后续处理答案选项时会出现空引用问题,必须在数据加载阶段完成赋值。
内容的提问来源于stack exchange,提问作者Maxwell Kwashie
相关产品推荐
相关产品推荐

