2012-12-10 37 views
0

我目前正在玩android API。目前我正在做一些GUI數據庫綁定,我開始有點惱火。Android數據庫訪問(簡單和高性能)

我有一個簡單的ListActivity與列表項的自定義佈局。現在我想將底層的ListView綁定到數據庫中的一個表。每當我對數據庫進行更改時,我都希望能夠通知ListView自行刷新並更新GUI。起初,問題看起來很簡單:只需添加一個SimpleCursorAdapter,將它傳遞給一個用於獲取數據的光標,將列綁定到佈局ID並向下。每當你想刷新時只需在ListView上調用notifyDataSetChanged()即可完成,對嗎?沒有!

原來,這樣數據庫將在UI線程中查詢,這顯然是一件壞事,因爲它會降低性能並可能導致「應用程序無響應」錯誤。

目前,它看起來像唯一的方法是使用Loaders和ContentProviders。這可能是處理數據訪問的最抽象和最乾淨的方式,但它也增加了大量代碼(尤其是在ContentProvider本身中,您必須執行大量醜陋的if-else開關事件處理以「解析」請求)。因此我的問題是:什麼是現有技術(向後兼容API級別< 11)的方式來連接數據庫表到ListView(或任何其他UI組件)?我真的必須使用ContentProvider嗎?

爲什麼這麼複雜? I.e .:掃描藍牙設備可以在20行代碼中實現,但對於(從我的角度來看)更常見的事情,比如數據連接,你必須實現至少兩個100+以上的locale。這太瘋狂了!

+0

優化您的數據庫,以便查詢速度更快。或者,使用asynctask進行查詢並替換遊標(或適配器)。 – njzk2

回答

0

...但它也增加了(在那裏你必須做很多醜陋的if-else 開關辦案的「解析」的要求,尤其是在 ContentProvider的本身)的代碼量巨大。

我不明白爲什麼會發生這種情況。將LoadersSimpleCursorAdapter實現爲ContentProvider所需的代碼在onCreateLoader中實例化CursorLoader,並將返回的Cursor交換爲LoaderManager.LoaderCallbacks接口的其他兩個回調。在提供商中,您只需在Cursor上使用setNotificationUri即可。

我真的必須使用ContentProvider嗎?

如果您想從CursorLoader中受益,請在數據庫修改後刷新數據,是的。你總是可以自己動手處理問題,並自己完成問題。