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

Android Studio SQLite报错:不存在_id列的问题求助

问题排查与解决方案

核心问题原因

报错提示no such column: _id,本质是实际数据库中的users表没有_id列,和代码定义不一致。这是因为SQLite的onCreate方法只会在数据库文件首次创建时执行,若之前已运行过APP,修改建表语句后旧数据库文件依然存在,不会自动更新表结构。

另外,你额外调用getUserId查询主键是多余的——SQLiteDatabase.insert()方法返回的newRowId就是新插入行自动生成的_id值,直接用这个值即可,无需二次查询。


修复步骤

1. 快速修复(测试阶段)

直接卸载当前APP后重新安装,这样会删除旧数据库文件,APP启动时会执行最新建表语句,创建包含_id列的users表。

2. 标准修复(适合保留数据场景)

通过升级数据库版本更新表结构:

  • 在DatabaseHelper类中实现onUpgrade方法:
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 测试环境可直接删除旧表重建,正式环境需编写数据迁移逻辑
        db.execSQL("DROP TABLE IF EXISTS " + DatabaseContract.Users.TABLE_NAME);
        onCreate(db);
    }
    
  • 修改DatabaseHelper构造函数中的数据库版本号(比如从1改为2):
    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 2); // 版本号+1
    }
    
    APP启动时会检测到版本变化,自动执行onUpgrade方法更新表结构。

3. 优化主键获取逻辑

删除getUserId方法,直接使用insert返回的newRowId:

// Check if the insertion was successful
if (newRowId != -1) {
    Toast.makeText(this, "User added successfully!", Toast.LENGTH_SHORT).show();
    // 转换newRowId为int(数据量极大时建议用long类型传递)
    int user_id = (int) newRowId;
    
    // 后续Intent传递代码不变
    Intent intent = new Intent(AddUserActivity.this, WelcomeActivity.class);
    intent.putExtra("USER_ID", user_id);
    intent.putExtra("USER_NAME", name);
    intent.putExtra("USER_EMAIL", email);
    intent.putExtra("USER_DISPLAY_NAME", displayName);
    
    startActivity(intent);
    finish();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:26:00