2011-09-01 49 views
2

不知何故,當調試一些基於位置的android應用程序時,我得到一個奇怪的例外。看看並分享您的想法:Android sqlite3說「沒有_id」,但表格肯定有

我已通過ContentProviderListActivity連接到sqlite3數據庫。現在,總是當我開始了ListActivity程序有異常,告訴我

column '_id' does not exist 

(不帶表名),我創造我的ListActivitySimpleCursorAdapter對象行死亡。

Cursor cursor = managedQuery(intent.getData(), new String[] {TrackTable.START_LOC, TrackTable.END_LOC}, null, null, 
      TrackTable.DEFAULT_SORT_ORDER); 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      R.layout.gps_track_entry, cursor, new String[] { 
        TrackTable.COLUMN_NAME_TIME_START, 
        TrackTable.COLUMN_NAME_TIME_END 
       }, new int[] { R.id.l_start, R.id.l_end }); 

我的數據庫看起來像這樣:

sqlite> .tables 
.tables 
android_metadata ocation track 
sqlite> . schema track 
.schema track 
CREATE TABLE track (
    _id INTEGER PRIMARY KEY, 
    start_location INTEGER, 
    end_location INTEGER, 
    start_time TEXT, 
    end_time TEXT 
); 
sqlite> .schema location 
.schema location 
CREATE TABLE location (
    _id INTEGER PRIMARY KEY, 
    long TEXT, 
    lat TEXT, 
    alt TEXT, 
    accu TEXT, 
    bear TEXT, 
    sped TEXT, 
    time TEXT); 
sqlite> .schema android_metadata 
.schema android_metadata 
CREATE TABLE android_metadata (locale TEXT); 

我的意思是,這是不太可能的錯誤是一個Android的錯誤,但它肯定看起來像一個,因爲沒有一個_id的唯一表android_metadata。但是,也許我以一種奇怪的方式寫了一些東西,虛擬機現在認爲我想使用android_metadata而不是track,我真的想使用它。

+3

您能否顯示用於創建光標的代碼? _id字段必須是遊標結果集的一部分。 –

+0

嘗試將其設置爲自動增量 - 創建表軌道(_id整數主鍵自動增量,........) – hooked82

+1

@Erich道格拉斯:不知道爲什麼你沒有寫這個答案。這絕對是問題所在。 – erikbwork

回答

4

埃裏克就在上面;問題在於你的SELECT查詢需要包含BaseColumns._ID作爲投影的一部分。喜歡的東西:

Cursor cursor = getContentResolver().query(TrackTable.CONTENT_URI, 
     new String[] { TrackTable._ID, TrackTable.COLUMN_NAME_TIME_START, 
     TrackTable.COLUMN_NAME_TIME_END }, null, null, null); 

BTW,查看javadoc瞭解CursorAdapter

光標必須包含一個名爲 「_id」 列或這個類將無法正常工作。

+0

絕對,這是問題!我會盡量記住,如果它認爲表格列不存在,我實際上可能錯過了正確地爲我的'Cursor'聲明投影。 – erikbwork

+0

是的,_id是一個容易遺忘的人,因爲你沒有明確地在代碼中使用它。 –

相關問題