2012-06-03 28 views
0

我試圖解決爲什麼我昨天收到此錯誤的一些代碼的問題:僅當試圖從表中查詢一列時,爲什麼會出現_id不存在錯誤?

java.lang.IllegalArgumentException: column '_id' does not exist 

我有很多更多的代碼,尤其是我沒有必要,所以我剝奪了很多出來讓它更容易理解我出錯的地方。但基本上這是我的模式:

database.execSQL("CREATE TABLE events (" + 
       "_id INTEGER PRIMARY KEY, event_name TEXT" + 
       ")"); 

正如人們可以說,看起來不錯。 除非我忘記閱讀,這顯然是最重要的。但後來我發現我的錯誤來自哪裏,或者至少我確定這是爲什麼。這個檢索遊標的代碼:

public Cursor getEventsName() { 
    return database.rawQuery("SELECT event_name FROM events", null); 
} 

根據android,這是錯誤。當我改變它爲:

public Cursor getEventsName() { 
    return database.rawQuery("SELECT * FROM events", null); 
} 

一切都是桃色。當前者時,它崩潰。任何理由爲什麼這是。我認爲在rawQuery()我可以做到這一點。只要我不包括where子句,我不是。任何幫助非常感謝。

回答

2

讓我們把這些,event光標:

public Cursor getEventsName() { 
    return database.rawQuery("SELECT event_name FROM events", null); 
} 

...和*光標:

public Cursor getEventsName() { 
    return database.rawQuery("SELECT * FROM events", null); 
} 

大多數你收到的答案(甚至在這裏的那些:In Android, does _id have to be present in any table created?)都在猜測可能會導致你的錯誤。我想我會回答你的問題,以及:

Any reason as to why (the former crashes and the later is peachy?)

*event光標之間的不同之處在於*是隱式選擇列,event只選擇event_name。在你events表中,*光標是等價的:

SELECT _id, event_name FROM events; 

這就是爲什麼這個遊標工作只是peachily。換句話說,你沒有收到此錯誤:

java.lang.IllegalArgumentException: column '_id' does not exist 

,因爲你是隱式*選擇_id列。

當然,獲取此錯誤的最可能原因是當您將數據與ListView,Spinner等綁定時;他們都傾向於使用某種形式的CursorAdapter。這是從CursorAdapter documentation

Adapter that exposes data from a Cursor to a ListView widget. The Cursor must include a column named "_id" or this class will not work.

所以解決方案很簡單:你必須選擇在查詢中_id列以及所需的其他列。 (編譯器不是對你說謊)

這就是說,如果這仍然不是你的應用程序有效或沒有意義,請張貼您使用遊標的代碼,並拋出錯誤。

+0

我明白你的意思了。看起來確實是可能的罪魁禍首,但是當我不想要的時候,它非常煩人。當我永遠不會使用它時,或者至少從我在實施中預見到的情況來看,我覺得這是浪費,但我現在一定會把它包括進去。感謝您花時間回答我的問題。 – Andy

1

我懷疑無論處理遊標是試圖獲取_ID列,但它沒有在您的選擇語句中指定。做這樣的事情,

public Cursor getEventsName() { 
    return database.rawQuery("SELECT _id, event_name FROM events", null); 
} 

一些Android組件,如SimpleCursorAdapter要求_ID在select語句可用,因爲它在內部使用時getItemId()被調用。

+0

嗯,這很煩人。我很欣賞這些意見。如果不是SimpleCursorAdapter,你會推薦哪些與Android上的數據庫相關的東西? – Andy

+0

我相信這很煩人:)基本上'適配器'需要每行的唯一ID才能正常工作。我不確定爲什麼在select語句中有'_ID'對你來說是一個問題,尤其是因爲你已經使用'_id'和'event_name'字段創建了表。 – stuckless

+0

我以前的評論應該是「我不相信」(我想你在一段時間後不能編輯評論) – stuckless

1

java.lang.IllegalArgumentException: column '_id' does not exist

我同樣的問題,這將引發異常,因爲SimpleCursorAdapter需要命名_idSELECT列,這樣您可以在例如,如果你創建了一些表KEY_ID列PK,所以你可以嘗試這樣解決問題:

SELECT KEY_ID AS _id, column1, column2 FROM SomeTable. 
0
public Cursor getEventsName() { 
return database.rawQuery("SELECT * FROM events", null); 

將其更改爲

public Cursor getEventsName(){ 

    final String[] columns = new String[]{"_id", "event_name "}; 
    return database.query(events, columns, "" , null, null, null, null); 
} 
相關問題