2017-01-22 51 views
0

我試圖通過它的_id檢索一行數據,並使用我回來的數據創建接種的實例。爲什麼從Sqlite數據庫中通過_id檢索對象時會出現SuperNotCalledException異常?

public Inoculation retrieveInoculationById(int id) { 
    Inoculation inoculation = new Inoculation(); 
    Cursor cursor = getDataById(InoculationsDao.TABLE_NAME, InoculationsDao.ID, id); 
    if (cursor.moveToFirst()) { 
    while (!cursor.isAfterLast()) { 
     inoculation.setBatchNumber(cursor.getString(cursor.getColumnIndex(InoculationsDao.BATCH_NUMBER))); 
     inoculation.setAdministrationSite(cursor.getString(cursor.getColumnIndex(InoculationsDao.ADMINISTRATION_SITE))); 
     inoculation.setAdministrationDate(cursor.getString(cursor.getColumnIndex(InoculationsDao.DATE))); 
    } 
    } 
    cursor.close(); 
    return inoculation; 

} 

getDataById方法很簡單:

public Cursor getDataById(String TABLE_NAME, String ID, int id) { 
    Cursor cursor = databaseConnection.rawQuery("SELECT * FROM " + TABLE_NAME + "WHERE " + ID + " = " + id , null); 
    return cursor; 
} 

似乎在rawQuery字符串失敗。

+0

您發佈的代碼至少有兩個問題 - SQL語法錯誤,缺少'cursor.moveToNext()'。這些都不會產生'SuperNotCalledException'。發佈你的堆棧跟蹤。 – laalto

+0

感謝您的光臨。這個問題現在已經解決了。這是ישואוהבאותך已經指出的SQL查詢中令人討厭的空間。這是導致「SuperNotCalledException」的這個SQL錯誤。奇怪,我知道。 沒有'cursor.moveToNext()',因爲我只對一行感興趣,因爲我通過它_id來檢索一個對象。 – SarahJessica

+0

'while'循環永遠不會終止'cursor.moveToNext()' – laalto

回答

1

這是因爲您的rawQuery字符串是錯誤的,因爲您缺少空格。

其中:

Cursor cursor = databaseConnection.rawQuery("SELECT * FROM " + TABLE_NAME + "WHERE " + ID + " = " + id , null); 

會產生一個查詢:

"SELECT * FROM TABLE_NAMEWHERE ID = id" 

應該是:

Cursor cursor = databaseConnection.rawQuery("SELECT * FROM " + TABLE_NAME + " WHERE " + ID + " = " + id , null); 

而不是使用rawQuery,您可以使用query()。類似這樣的:

// Your table columns: 
private String[] allColumns = { ID, YOUR_OTHER_COLUMN }; 

Cursor cursor = database.query(TABLE_NAME, allColumns, ID + " = " + id, null, 
           null, null, null); 
相關問題