2012-06-13 16 views
3

我有在SQLite數據庫不同表2個遊標。我試圖把從兩個光標數據到一個ListView但對於不同的格式從每個光標數據。使用cursor.respond(束)&cursor.getextras()

我想過使用MergeCursor到兩個光標,但ViewBinderSimpleCursorAdapter結合會看到他們作爲一個單一的光標,將無法區分格式化(除非我改變我的表,我不想做)。

最後,我發現了兩種叫做Cursor.repond(Bundle) & Cursor.getExtras()的方法,但開發者控制檯上的文檔非常短,而谷歌搜索這些方法並沒有闡明它們的用法。

我測試了我的想法在我的數據庫類使用resond()用於查詢:

extr.putString("table", the_tab); 
    Cursor c_in = db.rawQuery(qry, null); 
    c_in.respond(extr); 
    return c_in; 

而且使用getExtras()ViewBinder知道查詢表,並相應地格式化ListView項目:

Bundle extr=cur.getExtras(); 
String tab= extr.getString("table"); 

但我總是得到一個異常tabnull

我這個長描述後的問題是:我是否正確使用了respondgetExtras方法?如果沒有,是否有更好的方法來解決我的問題?

+0

爲什麼不開始只有一個選擇數據兩個表遊標? – Sam

+0

如果你的意思是加入,我會有同樣的問題,ViewBinder將無法區分格式化的數據 –

回答

2

嘗試在兩個SELECT的大樓裏表名作爲一個字段。

SELECT "A", * from tableA; SELECT "B", * from tableB; 

然後計算合併遊標。或者,

SELECT "A", * from tableA UNION ALL SELECT "B", * from tableB; 

現在光標的每一行都會有"A"在第一列,如果它從tableA來和"B"如果從tableB來了。因此,在ViewBinder中查看這一列很容易做出格式化決定。

+0

table_name不是表中的列 –

+0

我認爲你誤讀了我輸入的內容。我編輯得更清楚。答案是通過對包含每個遊標行第一列中的表名稱的查詢進行小的更改來提出與「額外」數據不同的解決方案。 – Gene

+0

我現在明白了。我會試一試 –

0

我會堅持讓你看看MergeCursorAbstractCursor來解決你的問題並獲得解決方案。例如,你可以檢查this的答案。

+0

MergeCursor會給我一個組合我的兩個遊標的遊標。然後,我將使用此MergeCursor來填充具有不同格式的單個ListView,以獲取來自最初兩個遊標的數​​據。這就是爲什麼我試圖使用Cursor.respond和Cursor.getExtras使數據的鑑別器能夠格式化行 –

2

如果你想在getExtras使用Bundle似乎AbstractCursor這是由AbstractWindowedCursor這是由SQLiteCursor延伸擴展定義setExtras方法。它的文檔讀取

設置將由getExtras()返回的android.os.Bundle。 null將被轉換爲android.os.Bundle.EMPTY。

respond根據文檔用於與Cursor出的帶外通信。

所以答案是:

((AbstractCursor) cursor).setExtras(bundle); 

那麼你應該能夠調用

cursor.getExtras(); 

在稍後的時間來檢索Bundle

編輯:

在進一步看,似乎setExtras被標記爲隱藏由於某種原因,所以它是公共的,並且旨在如所描述的(以及所希望的)的使用。看到ContactsProvider2 example

所以,我想出了使用CursorWrapper,並在那裏覆蓋getExtras提供Bundle。在我的情況下,我在CursorWrapper中創建了Bundle,所以我不需要一種設置它的方法。

@Override 
public Bundle getExtras() { 
    return _meta_data; 
} 
0

這裏有一個選擇(儘管you should not use it):

Class.forName("android.database.AbstractCursor") 
     .getMethod("setExtras", new Class[]{Bundle.class}) 
     .invoke(c_in, extr);