2012-03-05 21 views
2

なぜクエリが終了するのかわかりませんNullPointerExceptionSQLite INNER JOINがNullPointerExceptionをスローします

私のデータベースには2つのテーブルがあります。最初の単語はTABLE_WORDSです。 2番目はTABLE_TRANSと呼ばれ、翻訳が含まれています。 1つの単語は多くの翻訳を持つことができます。

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 + "));"; 

単語IDで翻訳を照会し、NPEがスローされます。 dbがnullであることを示唆している

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

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; 
} 

答えて

4

さて、あなたのコードを与えられました。そのステートメントに他の逆参照操作はありません。スタックトレースが実際にはのどこかにrawQueryと表示されない限り、dbはnullです。余談として...

をあなたはdbが非null値を割り当てることを意味している場所の兆候を与えられていないが、それは最初に確認することだ、くださいはあなたのSQLの値が含まれていません。それはSQL injection attacksのレシピです。代わりにパラメータ化されたSQLを使用してください。私の場合は

+0

デシベル:-)私の作品がnullではなかった、私は、クエリの前に、それを開くためにgorgot。パブリッククラスDbAdapter { \tプライベートDbHelperヘルパー; \tプライベートSQLiteDatabase db; \t private int openStatus;公共ボイドopenForReading(){ \t \t IF(OPENSTATUS == 0){ \t \t \tデシベル= helper.getReadableDatabase()。 \t \t \t openStatus = 1; \t \t} // IF(OPENSTATUS == 0)他 \t \t \t \t \t IF(OPENSTATUS == 2){ \t \t \t \t helper.close()。 \t \t \t \t db = helper.getReadableDatabase(); \t \t \t} //ネストされた(OPENSTATUS == 2) \t \t \t \t Log.i(Constants.LOG_TAGは、Constants.DB_ADAPTER_CLASS_NAME_SEP + "openForReading成功")場合、 \t} –

+0

@RedPlanet:この場合、表示された行はスタックトレースの先頭には表示されません。 (これがあなたの質問にスタックトレースを含めるべきだった理由です。)しかし、もしあなたが 'openForReading'を呼び出していなければ、' db' *はnullになります... –

1

私は

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) }); 

アム右Iを使用する必要がありますか?

1
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) }); 

これは