【问题标题】:Error no such column in SQLite when updating rows更新行时,SQLite 中没有这样的列
【发布时间】:2019-07-13 13:24:15
【问题描述】:

我正在尝试更新我的数据库中的行中的数据,但我发现没有这样的列(没有这样的列“莫斯科”或其他列)的错误

这是 DBHelper 代码:

public static final String tableName = "currentWeather";

public static final String KEY_ID = "_id";
public static final String cityName = "city";
public static final String cityTemp = "temperature";

并创建数据库:

sqLiteDatabase.execSQL("create table " + tableName + "(" + KEY_ID + " 
integer primary key autoincrement,"
    + cityName + " text," + cityTemp + " text, " + " UNIQUE(" + cityName + 
"))");

当我尝试执行 execSQl 时显示错误:

sqLiteDatabase.execSQL(
                    "UPDATE " + DBHelper.tableName + " SET " + 
DBHelper.cityTemp + "=" +
                            response.body().getForecastMain().getTemp() + " 
WHERE "
                            + DBHelper.cityName + "=" + cityName);

我希望按 cityName 逐行更新温度数据

【问题讨论】:

    标签: java android sqlite android-sqlite


    【解决方案1】:

    cityNameresponse.body().getForecastMain().getTemp() 是字符串,它们应该用单引号括起来传递给 sql 语句:

    sqLiteDatabase.execSQL(
        "UPDATE " + DBHelper.tableName + " SET " +  DBHelper.cityTemp + "='" + response.body().getForecastMain().getTemp() + "'" +
        "WHERE " + DBHelper.cityName + " = '" + cityName + "'"
    );
    

    但推荐且安全的更新方法是使用 ContentValues 和 ? 作为参数的占位符:

    ContentValues cv = new ContentValues();
    cv.put(DBHelper.cityTemp, String.valueOf(response.body().getForecastMain().getTemp()));
    int rows = sqLiteDatabase.update(
        DBHelper.tableName, 
        cv,
        DBHelper.cityName + " = ?",
        new String[] {cityName}
    );
    

    您可以检查整数变量 rows 的值。
    如果为 1,则表示更新了 1 行(因为 cityName 是唯一的)所以更新成功。

    【讨论】:

    • thanls,它奏效了。我只是不知道“引号”:/
    【解决方案2】:

    我认为您已更改列名或添加了新的列名(城市)。所以你可以通过两种方式修复它

    1. 通过从手机卸载应用程序
    2. 在升级方法中添加列名。

    例子:

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
      // If you need to add a column
       if (newVersion > oldVersion) {
          db.execSQL("ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0");
       }
     }
    

    【讨论】:

      【解决方案3】:

      问题是您需要在 UPDATE 语句中将 = 符号后的值用单引号括起来。至于数字,它们在两种情况下都有效。

      例如这里是正确的语法

      UPDATE currentWeather
      SET temperature = 45
      WHERE
          city = 'Moscow'
      

      但在您的代码中,我假设 cityName 的值 Moscow 不带单引号,因此转换后的 SQL 代码将是这样的

      UPDATE currentWeather
      SET temperature = 45
      WHERE
          city = Moscow
      

      现在 sql 解释器会认为 Moscow 是一些数据库对象或列或其他东西,而不是文字值。所以你需要用单引号将你的值括起来。

      【讨论】:

        【解决方案4】:

        还要考虑response.body().getForecastMain().getTemp()的数据类型是什么。 如果是int,你必须解析它什么的,因为相关列的数据类型是文本。

        【讨论】:

        • 不,它是字符串 :)
        猜你喜欢
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-30
        • 2022-01-05
        • 2020-06-02
        • 1970-01-01
        相关资源
        最近更新 更多