Java SQLite异常:Android中没有这样的列

Java SQLite异常:Android中没有这样的列,java,android,sqlite,android-activity,android-sqlite,Java,Android,Sqlite,Android Activity,Android Sqlite,我编写了一个应用程序来更新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.

我编写了一个应用程序来更新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)
02-19 23:59:34.200:E/SQLiteLog(18485):(1)没有这样的列:jo_2
02-19 23:59:34.205:W/dalvikvm(18485):threadid=11:线程以未捕获异常退出(组=0x41b30c08)
02-19 23:59:34.210:E/AndroidRuntime(18485):致命异常:IntentService[测试服务]
02-19 23:59:34.210:E/AndroidRuntime(18485):进程:com.kaizendroid.bc,PID:18485
02-19 23:59:34.210:E/AndroidRuntime(18485):android.database.sqlite.SQLiteException:没有这样的列:jo_2(代码1):,编译时:更新信息集名称=?,编号=?其中id=jo_2
02-19 23:59:34.210:E/AndroidRuntime(18485):位于android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法)
02-19 23:59:34.210:E/AndroidRuntime(18485):在android.database.sqlite.SQLiteConnection.acquiredPreparedStatement(SQLiteConnection.java:1113)
02-19 23:59:34.210:E/AndroidRuntime(18485):在android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:690)
02-19 23:59:34.210:E/AndroidRuntime(18485):在android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
02-19 23:59:34.210:E/AndroidRuntime(18485):位于android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)
02-19 23:59:34.210:E/AndroidRuntime(18485):位于android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31)
02-19 23:59:34.210:E/AndroidRuntime(18485):在android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1706)
02-19 23:59:34.210:E/AndroidRuntime(18485):位于android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1654)
02-19 23:59:34.210:E/AndroidRuntime(18485):位于com.kaizendroid.bc.DataHandler.updatedata(DataHandler.java:122)
02-19 23:59:34.210:E/AndroidRuntime(18485):位于com.kaizendroid.bc.MyTestService.getbcfromcloud(MyTestService.java:169)
02-19 23:59:34.210:E/AndroidRuntime(18485):在com.kaizendroid.bc.MyTestService.get\u local\u cloud\u compare(MyTestService.java:70)
02-19 23:59:34.210:E/AndroidRuntime(18485):位于com.kaizendroid.bc.MyTestService.onhandleint(MyTestService.java:49)
02-19 23:59:34.210:E/AndroidRuntime(18485):位于android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
02-19 23:59:34.210:E/AndroidRuntime(18485):在android.os.Handler.dispatchMessage(Handler.java:102)上
02-19 23:59:34.210:E/AndroidRuntime(18485):在android.os.Looper.loop(Looper.java:146)上
02-19 23:59:34.210:E/AndroidRuntime(18485):在android.os.HandlerThread.run(HandlerThread.java:61)上

错误并不是说表中缺少值“jo_2”,而是缺少名为
jo_2
的列。听起来好像您在某处有一些格式不正确的SQL

如果这是您的实际SQL(来自错误):

然后,您需要在
jou 2
部分周围加上一些引号:

UPDATE info SET name=?,number=? WHERE id = 'jo_2'
如果没有它们,SQLite会将列
id
与不存在的
jou 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;

不要手动注入SQL。这正是db.update的第四个参数的作用。@falmari:我完全同意。我用零Android体验回答了这个问题,所以第四个参数对我来说是未知的。
 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;