我想寫一個ListAdapter從看起來像這樣的數據庫提供數據:ListAdapter設計建議
CREATE TABLE notes (_id integer primary key,
content text);
CREATE TABLE tags (_id integer primary key,
name text,
pos integer
noteid integer,
foreign key(noteid) references notes(_id));
我使用這個數據庫來存儲筆記和它們相關的標籤。 ListAdapter的一個要求是它必須能夠在基礎數據更改時更新ListView內容。我可以查詢所有的筆記在數據庫中與此查詢:
select notes._id as id, notes.content, tags.pos, tags.name
from notes left join tags on id = tags.noteid
order by id, tags.pos;
哪位能給我的結果看起來像這樣(爲清楚起見,顯示爲空值):
0|foo bar baz|0|x
1|hello world|null|null
2|one more nn|0|yy
2|one more nn|1|y
正如你所看到的,記在結果中多於一行的標籤將位於多行中。這意味着我不能查看光標大小來確定筆記的數量,我需要遍歷整個光標以獲得計數。我不想這樣做。
我到目前爲止所提出的解決方案是使用兩個遊標:一個用上面提到的查詢,另一個用包含筆記表(select count(*) from notes
)中的行數的查詢。在構造函數中我稱之爲intializeCursors()
:
private void initializeCursors() {
notesCursor.moveToFirst();
countCursor.moveToFirst();
count = countCursor.getInt(0);
}
我已經實現的getItem()這樣的:
public Note getItem(int position) {
// notes is a List of notes that we have already read.
if (position < notes.size()) {
return notes.get(position);
}
int cursorPosition = notes.size();
while (cursorPosition <= position) {
// Creates a note by reading the correct number of rows.
Note note = NotesDb.noteFrom(notesCursor);
notes.add(note);
++cursorPosition;
}
return notes.get(position);
}
適配器假定遊標被一些的活動,呼籲他們startManagingCursor()
管理。
到目前爲止這麼好,我猜。現在的問題是如何處理被重新查詢的光標。由於我有兩個遊標,因此我需要爲它們註冊偵聽器,並且當我收到它們兩個的onChange()
時,我可以initializeCursors()
,並通知任何註冊到我的ListAdapter
的偵聽器的數據更改。
這是迄今爲止我所見過的最好的。我想用這個小組來檢查這種方法的完整性。 :-)這樣複雜嗎?也許我錯過了爲我解決這個問題的API的一部分?
在此先感謝!
不錯的答案。我對Android非常陌生,但我還沒有閱讀ContentProviders。這意味着我不會在我當前的代碼中使用它們。我只是使用一個基本的SQLiteDatabase,我已經包裝在一個名爲NotesDb的自定義類中。該類返回適配器使用的遊標。 關於數據庫設計的注意事項我認爲都是有效的。我想我會全部實現它們。 我需要這兩個表中的所有信息的原因是我想要在ListView中顯示每個音符的標籤。這就是爲什麼這一切都變得如此複雜,我認爲。 – Arlaharen 2011-01-21 17:41:59