0

我以前使用過Android的SQLite,但我總是手動管理數據行,所以我從來沒有使用類如SimpleCursorAdapter。我想現在就開始使用它們,但是我需要一些代碼實現的幫助,因爲它說我必須使用CursorLoader。我決定使用SQLiteCursorLoader庫。SQLite和SQLiteCursorLoader庫

下面是詳細信息:

我有一個表稱爲SQLite數據庫students。另外,Student模型類和StudentManager控制器類。撥打StudentManager#getAll()會返回包含所有學生的Cursor

我們轉到Fragment。我是而不是使用ListFragment爲多功能性。不管怎樣,到現在爲止我已經內部onCreate如下:

studentCursor = studentManager.getAll(); 
String[] from = new String[] { EventManager.COLUMN_TITLE }; 
String[] to = new String[] { R.id.title }; 
cursorAdapter = new SimpleCursorAdapter(this, R.layout.row_events, eventCursor, from, to, 0); 

然後,我有一個AsyncTask子類,可以從一個RESTful API檢索數據。

@Override 
public void doInBackground() { 
    // code to get an array of students 

    for(Student student in students) { 
     studentManager.save(student); 
    } 
} 

的問題是,在這部分我會用SQLiteCursorLoader和什麼

編輯:現在的問題是更可能是這樣的:我已經實現我自己的AsyncTask操作因爲我正在檢索並管理來自服務器的所有數據。因此,如果我已在doInBackground之內管理輔助線程中的數據,那麼對於任何操作,我還需要SQLiteCursorLoader嗎?

+0

我不知道「它」是什麼,但是您不必使用帶'SimpleCursorAdapter'的'Loader'。如果您想了解Loader框架的內容,請參閱[文檔](https://developer.android.com/guide/components/loaders.html)。 – CommonsWare

+0

感謝您的快速回答,我編輯了我的帖子,以獲得更準確的問題。 –

回答

4

所以,如果我已經在輔助線程感謝doInBackground管理數據,做我需要任何操作仍然SQLiteCursorLoader?

可能不是。 Loader的要點是異步加載數據。如果你自己這樣做,一個Loader將不會以某種方式使它更異步。 :-)

請記住,如果您更改了數據,則需要運行新的AsyncTask來更新UI以反映更改的數據,例如通過檢索新的Cursor。 A CursorLoader會自動執行此操作;一個SQLiteCursorLoader只能通過加載程序本身運行數據庫操作時「自動」執行該操作。

+0

好吧,這是一個非常完整的答案,我一直在尋找這個信息大約3個小時。非常感謝。我主要是從我的應用程序中進行SELECT操作,並且由於它們必須在服務器端進行驗證,所以我總是會在輔助線程中工作。編輯:另外,+1「如果你自己這樣做,一個裝載器不會讓它更異步。:-)」xD –

+0

你說我需要檢索一個新的光標,你的意思是設置一個新的光標到適配器? –

+0

@ChristopherFrancisco:是的,或者你正在用'Cursor'做的其他事情。 – CommonsWare

1

使用CursorLoader接口的目的是爲了不在主應用程序線程上執行數據庫操作(可能會影響應用程序的響應性)。 SQLiteCursorLoader提供的接口類似於舊的SimpleCursorAdapter,但將執行AsyncTask中的數據庫操作。

SQLiteCursorAdapter的GitHup頁面有更多信息/背景:https://github.com/commonsguy/cwac-loaderex

+0

我編輯我的帖子,以獲得更準確的問題,感謝您的快速答覆btw –

+0

從服務器檢索到的這些數據會發生什麼?我想它會進入你的SQLite數據庫。如果是這樣,並且你想加載這些數據以便顯示,那麼這部分也需要在'AsyncTask'中進行,這是'SQLiteCursorLoader'的來源。 –

+0

你是對的。到現在爲止,我正在doInBackground裏面保存數據庫,請問我能舉個例子嗎? –