Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更新行时SQLite中没有此类列时出错_Android_Sqlite_Android Sqlite - Fatal编程技术网

Android 更新行时SQLite中没有此类列时出错

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

我试图更新数据库中的行中的数据,但我发现了一个错误,即没有这样的列(没有这样的列“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 + 
"))");
当我尝试执行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,它起作用了。我只是不知道“引语”:/