更新行时,SQLite中没有此类列错误

时间:2019-07-13 13:24:15

标签: android sqlite android-sqlite

我正在尝试更新数据库中行中的数据,但是我发现没有这样的列(没有这样的列“ Moscow”或另一个)的错误

这是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更新行中的温度数据

4 个答案:

答案 0 :(得分:1)

我认为您已经更改了列名称或添加了新的列(城市)。因此,您可以通过两种方式对其进行修复

  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");
   }
 }

答案 1 :(得分: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}
);

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

答案 2 :(得分:1)

问题是,您需要在UPDATE语句中的单引号=之后包装值。至于数字,它们在两种情况下都可以工作。

例如,这是正确的语法

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

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

UPDATE currentWeather
SET temperature = 45
WHERE
    city = Moscow

现在sql解释器会认为Moscow是某些数据库对象或列或其他内容,而不是文字值。因此,您需要将值用单引号引起来。

答案 3 :(得分:1)

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