2014-12-17 3 views
-1

Я пытаюсь получить некоторые данные из профиля пользователя, но он не находит столбец. Я уже проверяю пробел между каждым запросом и кажется, что ничего плохого. До сих пор я не вижу проблемы, никакой идеи? Благодаря, прежде чем Вот мой код и сообщение об ошибкеНет такого исключения sqlite столбца

Название таблицы

private static final String TABLE_PROFILE = "users"; 
private static final String TABLE_STATUS = "status"; 

Пользователи Column Names

//Users column names 
private static final String KEY_USER_ID = "user_id"; 
private static final String KEY_USER_IMG = "picture"; 
private static final String KEY_USER_EMAIL = "email"; 
private static final String KEY_USER_NAME = "name"; 
private static final String KEY_USER_PASSWORD = "password"; 
private static final String KEY_USER_PHONE = "phone"; 

Статус Column Names

//Status column names 
private static final String KEY_STATUS_ID = "status_id"; 
private static final String KEY_STATUS = "status"; 

Таблица Создать Заявление о

//Users table create statement 
private static final String CREATE_TABLE_PROFILE = "CREATE TABLE " + TABLE_PROFILE + 
     "(" + KEY_USER_ID + " INTEGER PRIMARY KEY," + KEY_USER_IMG + " BLOB," + 
     KEY_USER_EMAIL + " VARCHAR," + KEY_USER_NAME + " VARCHAR," + KEY_USER_PASSWORD + " VARCHAR," 
     + KEY_USER_PHONE + " VARCHAR," + KEY_CREATED_AT + " DATETIME," + KEY_STATUS_ID + " INTEGER," 
     + " FOREIGN KEY " + "(" + KEY_STATUS_ID + ")" + " REFERENCES " + TABLE_STATUS + "(" + KEY_STATUS_ID + ")" + ")"; 

getProfile метод

public Profile getProfile(String username){ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    String selectQuery = "SELECT * FROM " + TABLE_PROFILE + " WHERE " + KEY_USER_EMAIL + " = " + username; 
    Log.e(LOG, selectQuery); 
    Cursor c = db.rawQuery(selectQuery, null); 

    if(c!=null) 
     c.moveToFirst(); 

    Profile pf = new Profile(); 
    pf.setID(c.getInt(c.getColumnIndex(KEY_USER_ID))); 
    pf.setImg(c.getBlob(c.getColumnIndex(KEY_USER_IMG))); 
    pf.setEmail(c.getString(c.getColumnIndex(KEY_USER_EMAIL))); 
    pf.setName(c.getString(c.getColumnIndex(KEY_USER_NAME))); 
    pf.setPassword(c.getString(c.getColumnIndex(KEY_USER_PASSWORD))); 
    pf.setPhone(c.getString(c.getColumnIndex(KEY_USER_PHONE))); 
    pf.setCreatedAt(c.getString(c.getColumnIndex(KEY_CREATED_AT))); 

    return pf; 
} 

LogCat сообщение

12-18 02:50:32.616: E/DatabaseHelper(7093): SELECT * FROM users WHERE email = test1 
12-18 02:50:32.616: E/SQLiteLog(7093): (1) no such column: test1 
12-18 02:50:32.636: E/AndroidRuntime(7093): FATAL EXCEPTION: main 
12-18 02:50:32.636: E/AndroidRuntime(7093): android.database.sqlite.SQLiteException: no such column: test1 (code 1): , while compiling: SELECT * FROM users WHERE email = test1 
+1

Вы должны окружить 'username' значение внутри запроса с верхушек (** **) , так как это ** строка ** значение. Ваш запрос должен быть следующим: 'SELECT * FROM users WHERE email = 'test1'' –

+0

Большое спасибо @dergolem, что он уже работает – mrconga

+0

Знаете ли вы, что' null' для in 'db.rawQuery (selectQuery, null);'? – njzk2

ответ

0

Не столбец KEY_USER_EMAIL строкового типа? Если это так, то ваш где предложение WHERE «+ KEY_USER_EMAIL +» = "+ имя пользователя пытается обратиться к значению столбца в KEY_USER_EMAIL = test1, в то время как он должен действительно относиться/использовать его как,

KEY_USER_EMAIL =«test1 ' Просто измените ваш ИНЕКЕ нравится -.

SELECT * FROM " + TABLE_PROFILE + " WHERE " + KEY_USER_EMAIL + " = '" + username + "'" 
+0

omg это работа, большое спасибо @ omkar.ghaisas – mrconga

+0

Pls upvote, если решение поможет решить вашу проблему под рукой. Помогает, другие быстро видят рабочее решение. –

+1

плохой практикой, потому что подвержен простой SQL-инъекции – njzk2

0

Используйте этот

String selectQuery = "SELECT * FROM " + TABLE_PROFILE + " WHERE " + KEY_USER_EMAIL + " = " + "'" + username + "'"; 

Значение имени пользователя должно быть передано в виде строки

+1

плохая практика, потому что при условии простой инъекции SQL – njzk2

1

В SQL строковые литералы должны быть указаны.

Однако, чтобы избежать проблем форматирования, как это (и атаки SQL-инъекции), используйте вместо parameters:

Cursor c = db.rawQuery("SELECT * FROM " + TABLE_PROFILE + 
         " WHERE " + KEY_USER_EMAIL + " = ?", 
         new String[]{ username }); 
Смежные вопросы