You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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; // 或者处理无数据场景
    }
    

错误原因说明

  1. 异步加载未等待:如果直接调用异步加载方法但不使用await,代码会跳过等待直接执行后续逻辑,此时Questions还是空集合或null,访问索引必然触发越界错误。
  2. 索引使用错误:C#集合的索引从0开始,你之前设置_currentQuestionIndex = 1,哪怕数据库里有1条题目,索引1也超出了集合范围(有效索引只有0)。
  3. Answers属性未赋值:虽然这次错误不是直接由此引发,但后续处理答案选项时会出现空引用问题,必须在数据加载阶段完成赋值。

内容的提问来源于stack exchange,提问作者Maxwell Kwashie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:42:33