【问题标题】:Android SQLite can't find column that existsAndroid SQLite 找不到存在的列
【发布时间】:2015-10-28 06:37:49
【问题描述】:

我正在创建一个表并在本地数据库 android 中使用插入或替换 sql,但它给了我 错误

*

表employeeTable 没有名为activationCode (code 1): 的列,编译时:插入或替换成 员工表(激活码、用户名、用户类型、lastSeen)值 ('6131313313' , 'testingcheck' , 'Employer' , 'Tue Oct 27 10:04:36 GMT+05:30 2015');

*

我的创建表代码:

sql = "CREATE TABLE " + EMPLOYEE_TABLE + "(" + COMMON_ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT, "
            + ACTIVATION_CODE_COLUMN + "TEXT ," + USER_NAME_COLUMN + "TEXT ," + USER_TYPE_COLUMN + "TEXT,"+LAST_SEE_COLUMN + "Text);";

    db.execSQL(sql);

}

我的插入或替换代码:

public void insertEmployeeDetails(String activationCode1 , String userName , String userType , String lastSeen) {
    String sql1 = "insert or replace into " + EMPLOYEE_TABLE + "(" + ACTIVATION_CODE_COLUMN + " , " + USER_NAME_COLUMN + " , " +
USER_TYPE_COLUMN +" , "+  LAST_SEE_COLUMN + ")" + "VALUES ('" +activationCode1 +"' , '" + userName + "' , '" + userType + "' , '"+ lastSeen + "');";

    getWritableDatabase().execSQL(sql1);
}

和回调代码:

myDbHelper.insertEmployeeDetails(employerConstants.activationCode,employerConstants.userName,
                employerConstants.userType , employerConstants.lastSeenon);

列激活码存在,但无法找出导致问题的原因?

【问题讨论】:

  • 卸载应用并重新安装 :)
  • @Amy 为什么?向我们展示您的表结构?
  • @DegenSharew:你说的表结构是什么意思?
  • @young_08 你确定你的表创建没有任何问题吗?因为您创建表查询而询问应该在column_namedatatype 之间包含空格,我在发布的代码中没有看到..
  • @young_08 我想这就是问题所在......只需在列名和数据类型(如ACTIVATION_CODE_COLUMN + "<space> TEXT ," )之间放置空格,对于创建 sql 中的其他人也是如此。

标签: android android-sqlite sqliteopenhelper


【解决方案1】:

使用以下代码插入数据。

dataBase = getWritableDatabase();
cValues = new ContentValues();
cValues.put(ACTIVATION_CODE_COLUMN, activationCode1);
cValues.put(USER_NAME_COLUMN, userName);
cValues.put(USER_TYPE_COLUMN, userType);
cValues.put( LAST_SEE_COLUMN, lastSeen);
dataBase.insert(EMPLOYEE_TABLE, null, cValues);
dataBase.close();

您的创建查询也包含错误

sql = "CREATE TABLE " + EMPLOYEE_TABLE + "(" + COMMON_ID_COLUMN + "  INTEGER PRIMARY KEY AUTOINCREMENT, "
        + ACTIVATION_CODE_COLUMN + " TEXT, " + USER_NAME_COLUMN + " TEXT , " + USER_TYPE_COLUMN + " TEXT, "+LAST_SEE_COLUMN + " Text);";

复制上面的查询并替换为您的查询 欢迎发表评论

【讨论】:

  • 我粘贴的创建查询中的错误是什么?它可能是次要的,这就是为什么无法弄清楚。请帮我学习一下。谢谢
  • 我用 urs 替换了我的创建查询,但仍然给出相同的错误):
  • 以这种格式创建您的查询 CREATE_TABLE1 = "CREATE TABLE " + TABLE1_NAME + "(" + KEY_ID + " INTEGER PRIMARY KEY autoincrement, " + KEY_DATE + " TEXT, " + KEY_CATEGORY + " TEXT, " + KEY_TEST_SCORE + " TEXT, " + KEY_STATUS + " TEXT " + ")";
  • @young_08 更正建表代码后,需要卸载重装app
  • 欢迎保持联系
【解决方案2】:

我认为问题出在您的创建查询中。尝试创建表的 SQL 查询

sql = "CREATE TABLE " + EMPLOYEE_TABLE + " (" 
        + COMMON_ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + ACTIVATION_CODE_COLUMN + " TEXT, " 
        + USER_NAME_COLUMN + " TEXT, " 
        + USER_TYPE_COLUMN + " TEXT, "
        + LAST_SEE_COLUMN + " TEXT);";

然后卸载并安装应用程序。它应该可以工作。

【讨论】:

  • @young_08 更正建表代码后,需要卸载重装app
【解决方案3】:

确保您在查询中也有适当的空格,您可以从模拟器中获取全部数据并检查哪里出了问题,我遇到了同样的问题,然后我搜索并能够从模拟器中导出数据库,之后由于查询中的空格,我知道我的字段名称不正确,我使用的是 genymotion。如果您需要,我可以粘贴从模拟器中导出数据的过程。

【讨论】:

【解决方案4】:

让你的 sqliteHelperClass 扩展 SQLiteOpenHelper。

例子

public SqliteHelper extends SQLiteOpenHelper {
    public static final int VERSION = 1;
    public static final String NAME = "your db name";

    public SqliteHelper(Context context) {
        super(context, NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // your db creates here
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // your db upgrade here
        // ex) drop & create
    }

}

有了这个帮助类, 如果您需要升级数据库,只需更改 Version 值 + 1

我希望这对你有帮助。

【讨论】:

  • 我已经在使用它了。我只发布了命令代码,但我的 sqlite 文件看起来一样。所以,这不是问题。谢谢
  • 试试这个String sql1 = "insert or replace into " + EMPLOYEE_TABLE + "(" + USER_NAME_COLUMN + " , " + USER_TYPE_COLUMN +" , "+ LAST_SEE_COLUMN + ")" + "VALUES (" + userName + "' , '" + userType + "' , '"+ lastSeen + "') WHERE " + ACTIVATION_CODE_COLUMN + " ='" + activationCode1 +"'";
  • activation_code 有autoincrement,在where下使用
  • 据我所知:插入语法不支持 WHERE 语法。这显然是一个语法错误。
  • linkinsert or replace 不支持自动递增的主键。对于where,我很抱歉语法错误。
猜你喜欢
  • 1970-01-01
  • 2017-01-08
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多