2015-03-24 4 views
0

При попытке реализовать хранилище SQLite возникло странное поведение. Символы «?» Не заменяются.rawQuery() в Android SQLite не компилирует параметры

Мой код:

public class DBHandler extends SQLiteOpenHelper { 

    public void writeTask(JSONObject object) throws JSONException { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     String id = object.get(OBJECT_ID).toString(); 
     String content = object.toString(); 
     String md5 = "md5"; //testing 

     Cursor c = db.rawQuery("INSERT OR REPLACE INTO ? (? , ? , ?) VALUES (? , ? , ?);", new String[] {TABLE_OBJECTS, OBJECT_ID, OBJECT_CONTENT, OBJECT_MD5, id, content, md5 }); 
    } 
} 

Затем он бросает странную ошибку:

android.database.sqlite.SQLiteException: near "?": syntax error (code 1): , while compiling: INSERT OR REPLACE INTO ? (? , ? , ?) VALUES (? , ? , ?); 

Первая ошибка исправленное, но до сих пор не работает:

String selectQuery = "INSERT OR REPLACE INTO " + TABLE_OBJECTS + " (" 
      + OBJECT_ID + "," + OBJECT_CONTENT + "," + OBJECT_MD5 + ") " 
      + "VALUES (? , ? , ?);"; 
String[] args = { id, content, md5 }; 
      Log.d("FP", selectQuery); 

Cursor c = db.rawQuery(selectQuery,args); 

Теперь база данных является нетронутым после этого запрос. Журналы показать мой запрос:

INSERT OR REPLACE INTO objects (id,content,md5) VALUES (?,?,?); 

Любые предложения?

так, rawQuery() только для ВЫБРАТЬ.

Но мне все же нужно выполнять экранирование специальных символов, потому что контент -variable - это сжатый JSON, и execSQL этого не допускает.

+0

hmmm rawQuery для вставок .. интересный выбор ... очевидно, есть аналогичный api с 'db.insert' с' ContentValues' .... – Selvin

+0

попытался использовать что-то вроде ** UPSERT ** и нашел пример с * * ВСТАВИТЬ ИЛИ ЗАМЕНИТЬ ** – Schtz

+0

есть кусок для 'INSERT OR REPLACE' в классе' SQliteDatabase' ... просто взгляните на документы ... имя метода должно быть очевидно ... может быть, хорошо , hmmm, 'replace' ... – Selvin

ответ

6

Вы можете использовать ? только для обязательных литералов, например, в вашем VALUES(), а не для идентификаторов, таких как имена таблиц или столбцов ранее в вашем SQL.

Если вам нужно использовать переменные для идентификаторов, используйте регулярную конкатенацию строк в Java.

Также обратите внимание, что только rawQuery() не выполнит ваш SQL. Вместо этого используйте вместо этого execSQL().

+0

ah, rawQuery только для ** SELECT ** – Schtz

+0

Вы можете использовать его для любого SQL, но вам нужно будет переместить курсор для его выполнения. Поэтому вы не должны использовать его для других, кроме selects и т.п. – laalto

Смежные вопросы