SQLite INNER JOIN генерирует исключение NullPointerException - PullRequest
2 голосов
/ 05 марта 2012

Я не могу понять, почему запрос в результате выдает NullPointerException.

Моя база данных содержит две таблицы. Первый называется TABLE_WORDS содержит слова; второй называется TABLE_TRANS содержит переводы. Одно слово может иметь много переводов.

public static final String CREATE_TABLE_WORDS = "CREATE TABLE " + TABLE_WORDS + 
    " (" + WORDS_ID + " INTEGER PRIMARY KEY, " + WORDS_WORD + 
    " TEXT);";

public static final String CREATE_TABLE_TRANS = "CREATE TABLE " + TABLE_TRANS + 
    " (" + TRANS_ID + " INTEGER PRIMARY KEY, " + 
    TRANS_WORD + " TEXT, " + 
    TRANS_FOREIGN_ID_WORD + " INTEGER, " +
    "FOREIGN KEY (" + TRANS_FOREIGN_ID_WORD + ") REFERENCES " + TABLE_WORDS + "(" + WORDS_ID + "));";

Я запрашиваю перевод по идентификатору слова, и выбрасывается NPE.

public Cursor queryTransesByWord(int idSend) {

    String query = "SELECT " + DbHelper.TABLE_WORDS + "." + DbHelper.WORDS_WORD + ", " +
        DbHelper.TABLE_TRANS + "." + DbHelper.TRANS_WORD + 
        " FROM " + DbHelper.TABLE_WORDS + 
        " INNER JOIN " + DbHelper.TABLE_TRANS + 
        " ON " + DbHelper.TABLE_WORDS + "." + DbHelper.WORDS_ID + "=" + 
        DbHelper.TABLE_TRANS + "." + DbHelper.TRANS_FOREIGN_ID_WORD + " WHERE " +
        DbHelper.TABLE_WORDS + "." + DbHelper.WORDS_ID + "="+ idSend; 

    Cursor cur = db.rawQuery(query, null); // NullPointer always throws here

    if (cur != null)
        cur.moveToFirst();
    else
        Log.e(Constants.LOG_TAG, Constants.DB_ADAPTER_CLASS_NAME_SEP + "queryTransesByWord cursor is null");
    return cur;
}

Ответы [ 3 ]

4 голосов
/ 05 марта 2012

Ну, учитывая ваш код:

Cursor cur = db.rawQuery(query, null); // NullPointer always throws here

Это говорит о том, что db является нулевым.В этом операторе нет другой операции разыменования - поэтому, если трассировка стека на самом деле не показывает где-то rawQuery, то db будет нулевым.Вы не указали, где db предназначено для присвоения ненулевого значения, но это первое, что нужно проверить ...

В качестве отступления , пожалуйста, не включайте значения в ваш SQL таким образом - это рецепт для атак SQL-инъекций .Вместо этого используйте параметризованный SQL.

1 голос
/ 23 апреля 2013
String query = "SELECT " + DbHelper.TABLE_WORDS + "." + DbHelper.WORDS_WORD + ", " +
DbHelper.TABLE_TRANS + "." + DbHelper.TRANS_WORD + 
" FROM " + DbHelper.TABLE_WORDS + 
" INNER JOIN " + DbHelper.TABLE_TRANS + 
" ON " + DbHelper.TABLE_WORDS + "." + DbHelper.WORDS_ID + "=" + 
DbHelper.TABLE_TRANS + "." + DbHelper.TRANS_FOREIGN_ID_WORD + " WHERE " +
DbHelper.TABLE_WORDS + "." + DbHelper.WORDS_ID + "=?";    

Cursor cur = db.rawQuery(query, new String[] { Integer.toString(idSend) } );

это работает для меня: -)

1 голос
/ 06 марта 2012

В моем случае я должен использовать

String query = "SELECT " + DbHelper.TABLE_WORDS + "." + DbHelper.WORDS_WORD + ", " +
    DbHelper.TABLE_TRANS + "." + DbHelper.TRANS_WORD + 
    " FROM " + DbHelper.TABLE_WORDS + 
    " INNER JOIN " + DbHelper.TABLE_TRANS + 
    " ON " + DbHelper.TABLE_WORDS + "." + DbHelper.WORDS_ID + "=" + 
    DbHelper.TABLE_TRANS + "." + DbHelper.TRANS_FOREIGN_ID_WORD + " WHERE " +
    DbHelper.TABLE_WORDS + "." + DbHelper.WORDS_ID + "=?";    

Cursor cur = db.rawQuery(query, new String[] { Integer.toString(idSend) } );

Я прав?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...