2015-09-04 2 views
-2

Это мой вспомогательный класс db, который создает db, когда приложение установлено в первый раз.SQLiteException: no такой столбец :, при компиляции

Когда я регистрирую нового пользователя, если его именем являются буквы типа «john», это дает мне исключение.
Однако имена пользователей, например 4, 56 (т. Е .: цифры), не дают ошибок. Зачем?

class DBHelper extends SQLiteOpenHelper { 

public DBHelper(Context context) { 
    super(context, "myDB", null, 1); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    Log.d("x", " database CREATED!!! -------------------------"); 
    db.execSQL("create table userData (" 
      + "id integer primary key autoincrement," 
      + "name text," 
      + "password text," 
      + "hero int," 
      + "level int," 
      + "loggedin int" 
      + ");"); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

} 

}

EDIT:

Это кусок кода, где я на самом деле попытаться обновить БД.

public void login(View v){ 
    //..some code here 
    db.execSQL("update userData set loggedin=1 where name=" + username2) ; 
    } 
+1

Нужно увидеть, где вы вставляете запись в БД –

+1

вам нужно дать больше кода. –

+0

@ FrankN.Stein, что? На самом деле? Почему? – ERJAN

ответ

0

if his name is letters like "john", it gives me an exception. However, usernames like 4, 56 (i.e.: digits only) give no errors. Why?

Wild Guess: Вы забыли вложить John в одинарные кавычки, т.е .: 'John'.

Причина этого в том, что John является строкой.
и строки должны быть разделены одинарные кавычки (")

Имейте в виду, что, если сама строка содержит кавычки (или апостроф), т.е. 'I'm aware of that', то апостроф он должен быть вдвое, т.е. 'I''m aware of that'.


Если вы не хотите возиться с кавычками, есть лучший способ сделать Android справиться с этим для вас: связанные параметры.

На практике все значения в вашем запросе должны быть заменены заполнителем вопросительного знака (?).

И вы задаете запрос массив строк, содержащий все значения, подлежащие замене.

Таким образом, вы также защищены от SQL-инъекций.


Примером может прояснить понятие лучше:

// Two values to be passed... 
final String sql = 
    "SELECT date, score FROM " + DB_TABLE + 
    " WHERE strftime('%Y', date) = ? AND " + 
    "CAST((strftime('%m', date)) AS INTEGER) = ? ORDER BY date DESC"; 

// ... into the string array parameter of the rawQuery() overload 
final Cursor cur = 
    db.rawQuery 
    (
     sql, 
     new String[] 
     { 
      String.valueOf(CLS_Utils.yearUsing), 
      String.valueOf(month) 
     } 
    ); 

Примечание.

То же самое относится и к execSQL().
Поэтому его можно использовать и в INSERT, UPDATE и DELETE.

0

Все строки в sql должны быть заключены в '. Цитируется https://www.sqlite.org/lang_expr.html:..

«Строка постоянной формируются, заключив строку в одиночных кавычках (') Одиночная кавычка внутри строки может быть закодирована, помещая две одиночных кавычек подряд - как и в Pascal C- стиль escapes с использованием символа обратной косой черты не поддерживается, потому что они не являются стандартными SQL."

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