Android 更新行时SQLite中没有此类列时出错
我试图更新数据库中的行中的数据,但我发现了一个错误,即没有这样的列(没有这样的列“Moscow”或其他列) 这是DBHelper代码:Android 更新行时SQLite中没有此类列时出错,android,sqlite,android-sqlite,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
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 +
"))");
当我尝试执行SQL作为响应时,会显示错误:
sqLiteDatabase.execSQL(
"UPDATE " + DBHelper.tableName + " SET " +
DBHelper.cityTemp + "=" +
response.body().getForecastMain().getTemp() + "
WHERE "
+ DBHelper.cityName + "=" + cityName);
我希望按cityName更新行中的温度数据我想您已经更改了列名或添加了新的列名(city)。所以你可以用两种方法来修复它
@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");
}
}
我认为您已经更改了列名或添加了新列名(城市)。所以你可以用两种方法来修复它
@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");
}
}
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
是唯一的),因此更新成功 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
是唯一的),因此更新成功 问题是需要在UPDATE语句中的=
登录单引号后包装这些值。至于数字,它们在两种情况下都有效
例如,下面是正确的语法
UPDATE currentWeather
SET temperature = 45
WHERE
city = 'Moscow'
但是在您的代码中,我假设cityName
的值Moscow
没有单引号,因此转换后的SQL代码如下
UPDATE currentWeather
SET temperature = 45
WHERE
city = Moscow
现在sql解释器会认为
Moscow
是某个数据库对象或列或其他东西,而不是一个文本值。因此,您需要将您的值用单引号括起来。问题是您需要在UPDATE语句中的=
登录单引号后包装这些值。至于数字,它们在两种情况下都有效
例如,下面是正确的语法
UPDATE currentWeather
SET temperature = 45
WHERE
city = 'Moscow'
但是在您的代码中,我假设cityName
的值Moscow
没有单引号,因此转换后的SQL代码如下
UPDATE currentWeather
SET temperature = 45
WHERE
city = Moscow
现在sql解释器会认为
Moscow
是某个数据库对象或列或其他东西,而不是一个文本值。因此,您需要以单引号包围您的值。也考虑“<代码>响应”。ByDyE()、GeEngestAsMistMe()、GETTimeFor(< /代码>)是什么。
如果是<代码> int /代码>,您必须解析它或某些东西,因为相关列的数据类型是文本。< P>也考虑“<代码>响应”的数据类型。
如果它是
int
您必须解析它或其他东西,因为相关列的数据类型是Text。不,它是String:)不,它是String:)thanls,它起作用了。我只是不知道“引号”的意思:/thanls,它起作用了。我只是不知道“引语”:/