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

无法将SQLite数据通过Cursor加载到首页SimpleCursorAdapter的问题求助

解决SimpleCursorAdapter加载Cursor时提示“no such column: _id”的问题

看起来你遇到的核心问题有两个:一是数据库表实际没有_id列(虽然你写了建表语句),二是Cursor的处理逻辑有误,我们一步步来解决:

1. 为什么会提示“no such column: _id”?

你已经在代码里定义了_id作为主键,但错误日志显示查询的表CityTable里没有这个列,大概率是旧的数据库没有被更新到最新版本。你设置了DATABASE_VERSION=8,但如果你的SQLiteOpenHelper没有实现onUpgrade方法,修改建表语句后,数据库不会自动更新结构,旧表依然是没有_id列的版本。

解决方法:

  • 测试阶段快速修复:卸载应用后重新安装,这样会清除旧数据库,重新执行最新的建表语句。
  • 正式环境规范修复:在你的SQLiteOpenHelper中实现onUpgrade方法,确保版本升级时更新表结构:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // 注意:正式环境如果有用户数据,不要直接删表,要做数据迁移!这里是测试用的简单方案
    db.execSQL("DROP TABLE IF EXISTS " + Citietable);
    onCreate(db);
}

2. 修复Cursor的获取逻辑

你的CitiesData()方法里有个错误:调用citi.moveToNext()后再返回游标,这会导致两个问题:

  • 如果游标有数据,会跳过第一条记录
  • 如果游标为空,虽然你提示了信息,但返回的游标位置已经到了末尾,SimpleCursorAdapter无法正确处理

修改后的CitiesData()方法应该直接返回查询后的游标,不要提前移动游标位置:

public Cursor CitiesData(){ 
    SQLiteDatabase db = foodCourt_loginData.getReadableDatabase(); 
    // 直接返回查询结果,SimpleCursorAdapter会自行处理游标位置
    return db.query(FoodCourt_LoginData.Citietable, 
                    new String[]{FoodCourt_LoginData.rowid, FoodCourt_LoginData.City}, 
                    null, null, null, null, null); 
}

3. 额外检查点

  • 确认Citietable常量的值确实是CityTable(和错误日志里的表名一致),避免拼写错误导致查询了错误的表。
  • 确保SimpleCursorAdapter的构造参数正确,你当前的参数是没问题的,但要注意String[] cities里的列名必须和Cursor返回的列名完全匹配。

按照上面的步骤修改后,应该就能正常加载数据到Spinner里了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:08:58