SQLite 异常:Android 中没有这样的列
SQLite Exception: no such column in Android
我写了一个应用程序来更新 SQlite Db 中的行,下面是数据处理程序中的更新代码:
public long updatedata(String ID, String NAME,String NUMBER)
{
ContentValues content = new ContentValues();
content.put(name, NAME);
content.put(number,NUMBER);
return db.update(table_name, content, "id "+"="+ID, null);
}
现在,当我需要更新一行时,我使用了以下代码:
Datahandler data =new Datahandler();
data.open();
long updateresult = data.updatedata(oldID, cloudnames.get(pos), cloudnumbers.get(pos));
data.close();
还假设上面提供的值存在且有效,而且我确定我的数据库中有一个 id = jo_2,问题是当我 运行 代码异常时出现如下:
02-19 23:59:34.200: E/SQLiteLog(18485): (1) no such column: jo_2
02-19 23:59:34.205: W/dalvikvm(18485): threadid=11: thread exiting with uncaught exception (group=0x41b30c08)
02-19 23:59:34.210: E/AndroidRuntime(18485): FATAL EXCEPTION: IntentService[test-service]
02-19 23:59:34.210: E/AndroidRuntime(18485): Process: com.kaizendroid.bc, PID: 18485
02-19 23:59:34.210: E/AndroidRuntime(18485): android.database.sqlite.SQLiteException: no such column: jo_2 (code 1): , while compiling: UPDATE info SET name=?,number=? WHERE id =jo_2
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1113)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:690)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1706)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1654)
02-19 23:59:34.210: E/AndroidRuntime(18485): at com.kaizendroid.bc.DataHandler.updatedata(DataHandler.java:122)
02-19 23:59:34.210: E/AndroidRuntime(18485): at com.kaizendroid.bc.MyTestService.getbcfromcloud(MyTestService.java:169)
02-19 23:59:34.210: E/AndroidRuntime(18485): at com.kaizendroid.bc.MyTestService.get_local_cloud_compare(MyTestService.java:70)
02-19 23:59:34.210: E/AndroidRuntime(18485): at com.kaizendroid.bc.MyTestService.onHandleIntent(MyTestService.java:49)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.os.Handler.dispatchMessage(Handler.java:102)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.os.Looper.loop(Looper.java:146)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.os.HandlerThread.run(HandlerThread.java:61)
错误并不是说 table 中缺少 "jo_2" 的值,而是说 列 名为 jo_2
不见了。听起来你在某处有一些格式错误的 SQL。
如果这是你的实际 SQL(来自错误):
UPDATE info SET name=?,number=? WHERE id =jo_2
然后你需要在 jo_2
部分加上一些引号:
UPDATE info SET name=?,number=? WHERE id = 'jo_2'
如果没有它们,SQLite 会将列 id
与 列 jo_2
进行比较,后者不存在。
要解决此问题,您可以更改代码中的这一行:
return db.update(table_name, content, "id = '" + ID + "'", null);
// add quotes here ^ and ^
编辑: 显示了一种更安全的方法来修复代码以避免错误。
您正在接受 SQL 注射。使用内置的 where 子句参数插入。
public int update (String table, ContentValues values, String whereClause, String[] whereArgs)
所以你想要
return db.update(table_name, content, "id = ?", new String[] {"jo_2"});
我运行陷入这个麻烦你可以的是这个
String originalYearString = uri.getLastPathSegment();
where= TableName.COL_YEAR_NAME+" = "+"'"+originalYearString+"'";//placing values of the column to be updated in '' is important or else it detects it as a single table column
if(!TextUtils.isEmpty(selection)){
where+=" AND "+selection;
}
rowUpdated=database.update(TABLE_NAME,values,where,selectionArgs);
break;
我写了一个应用程序来更新 SQlite Db 中的行,下面是数据处理程序中的更新代码:
public long updatedata(String ID, String NAME,String NUMBER)
{
ContentValues content = new ContentValues();
content.put(name, NAME);
content.put(number,NUMBER);
return db.update(table_name, content, "id "+"="+ID, null);
}
现在,当我需要更新一行时,我使用了以下代码:
Datahandler data =new Datahandler();
data.open();
long updateresult = data.updatedata(oldID, cloudnames.get(pos), cloudnumbers.get(pos));
data.close();
还假设上面提供的值存在且有效,而且我确定我的数据库中有一个 id = jo_2,问题是当我 运行 代码异常时出现如下:
02-19 23:59:34.200: E/SQLiteLog(18485): (1) no such column: jo_2
02-19 23:59:34.205: W/dalvikvm(18485): threadid=11: thread exiting with uncaught exception (group=0x41b30c08)
02-19 23:59:34.210: E/AndroidRuntime(18485): FATAL EXCEPTION: IntentService[test-service]
02-19 23:59:34.210: E/AndroidRuntime(18485): Process: com.kaizendroid.bc, PID: 18485
02-19 23:59:34.210: E/AndroidRuntime(18485): android.database.sqlite.SQLiteException: no such column: jo_2 (code 1): , while compiling: UPDATE info SET name=?,number=? WHERE id =jo_2
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1113)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:690)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1706)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1654)
02-19 23:59:34.210: E/AndroidRuntime(18485): at com.kaizendroid.bc.DataHandler.updatedata(DataHandler.java:122)
02-19 23:59:34.210: E/AndroidRuntime(18485): at com.kaizendroid.bc.MyTestService.getbcfromcloud(MyTestService.java:169)
02-19 23:59:34.210: E/AndroidRuntime(18485): at com.kaizendroid.bc.MyTestService.get_local_cloud_compare(MyTestService.java:70)
02-19 23:59:34.210: E/AndroidRuntime(18485): at com.kaizendroid.bc.MyTestService.onHandleIntent(MyTestService.java:49)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.os.Handler.dispatchMessage(Handler.java:102)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.os.Looper.loop(Looper.java:146)
02-19 23:59:34.210: E/AndroidRuntime(18485): at android.os.HandlerThread.run(HandlerThread.java:61)
错误并不是说 table 中缺少 "jo_2" 的值,而是说 列 名为 jo_2
不见了。听起来你在某处有一些格式错误的 SQL。
如果这是你的实际 SQL(来自错误):
UPDATE info SET name=?,number=? WHERE id =jo_2
然后你需要在 jo_2
部分加上一些引号:
UPDATE info SET name=?,number=? WHERE id = 'jo_2'
如果没有它们,SQLite 会将列 id
与 列 jo_2
进行比较,后者不存在。
要解决此问题,您可以更改代码中的这一行:
return db.update(table_name, content, "id = '" + ID + "'", null);
// add quotes here ^ and ^
编辑:
您正在接受 SQL 注射。使用内置的 where 子句参数插入。
public int update (String table, ContentValues values, String whereClause, String[] whereArgs)
所以你想要
return db.update(table_name, content, "id = ?", new String[] {"jo_2"});
我运行陷入这个麻烦你可以的是这个
String originalYearString = uri.getLastPathSegment();
where= TableName.COL_YEAR_NAME+" = "+"'"+originalYearString+"'";//placing values of the column to be updated in '' is important or else it detects it as a single table column
if(!TextUtils.isEmpty(selection)){
where+=" AND "+selection;
}
rowUpdated=database.update(TABLE_NAME,values,where,selectionArgs);
break;