我正在尝试更新数据库中行中的数据,但是我发现没有这样的列(没有这样的列“ 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更新行中的温度数据
答案 0 :(得分:1)
我认为您已经更改了列名称或添加了新的列(城市)。因此,您可以通过两种方式对其进行修复
示例:
@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)
cityName
和response.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
,则必须对其进行解析,因为相关列的数据类型为“文本”。