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

Android SQLite按玩家数量取最后N行数据时Cursor指向-1问题求助

解决Cursor无法读取SQLite数据的问题

针对你遇到的Cursor始终指向-1(无数据返回)的问题,可按以下步骤排查修复:

1. 验证PlayerCount的有效性

首先确认GameMaker.GetPlayers()返回的PlayerCount值是否正确(应为2或4)。如果该值为0,SQL语句的LIMIT 0会直接返回空结果。

  • 添加日志打印值:
    Log.d("GameComplete", "PlayerCount: " + PlayerCount);
    
  • 若值异常,检查GameMaker.GetPlayers()的实现逻辑,确保它能正确传递当前游戏的玩家数量。

2. 确认数据库中存在对应数据

检查目标表中是否有足够的记录:

  • 使用Android Studio的Device File Explorer找到应用的数据库文件(路径一般为data/data/[你的包名]/databases/),导出后用SQLite浏览器打开,查看tableName表的内容。
  • 如果表中没有数据,先确认玩家数据是否已正确插入到数据库中,检查DBHandler的插入方法是否正常执行。

3. 检查SQL查询语句的正确性

确保拼接后的SQL语句无语法错误,且表名、列名与数据库实际一致:

  • 打印最终生成的SQL语句:
    Log.d("GameComplete", "SQL Query: " + query);
    
  • 将打印出的SQL语句直接在SQLite浏览器中执行,验证是否能返回预期结果。重点检查:
    • DBHandler.tableName、DBHandler.DBId、DBHandler.DBName、DBHandler.DBTotal这些常量的拼写是否与数据库表/列名完全一致(SQLite默认大小写不敏感,但如果创建表时使用了引号区分大小写则需严格匹配)。
    • 排序逻辑ORDER BY DBId DESC是否正确,确保是按ID倒序取最新的记录。

4. 优化Cursor的处理逻辑

原代码中while(cursor.moveToNext())的写法在Cursor为空时会直接跳过循环,可调整为更严谨的判断方式:

StringBuilder resultString = new StringBuilder();
if (cursor != null && cursor.moveToFirst()) {
    do {
        int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHandler.DBId));
        String name = cursor.getString(cursor.getColumnIndexOrThrow(columnName));
        // 注意:如果分数是整数类型,用getInt而非getString
        int score = cursor.getInt(cursor.getColumnIndexOrThrow(columnScore));
        
        resultString.append("ID: ").append(id)
                .append(", Name: ").append(name)
                .append(", Score: ").append(score)
                .append("\n");
    } while (cursor.moveToNext());
}
  • 使用getColumnIndexOrThrow()替代getColumnIndex(),如果列名错误会抛出异常,便于快速定位问题。
  • 如果DBTotal是整数类型,用getInt()读取更合适,避免类型转换问题。

5. 确认DBHandler的数据库初始化逻辑

检查DBHandler的onCreate()方法是否正确创建了目标表:

@Override
public void onCreate(SQLiteDatabase db) {
    String createTableSql = "CREATE TABLE " + DBHandler.tableName + " ("
            + DBHandler.DBId + " INTEGER PRIMARY KEY AUTOINCREMENT, "
            + DBHandler.DBName + " TEXT NOT NULL, "
            + DBHandler.DBTotal + " INTEGER DEFAULT 0)";
    db.execSQL(createTableSql);
}
  • 如果之前修改过表结构,需确保onUpgrade()方法正确处理了数据库升级,或者卸载旧应用后重新安装,避免旧表结构导致的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 07:15:10