0

什麼是實現數據庫框架的「Android方式」?Android數據庫最佳實踐?

這兩個目標:

  1. 它應該是足夠通用的,所以說「數據庫」可以通過網絡SQLite數據庫什麼的。
  2. 它應該是多線程安全的。 (更新:通過「線程安全」,我的意思是它不應該在主UI線程中運行,數據庫調用不應該相互衝突,並且系統應該知道如何將結果通信回主UI線程。)
  3. 更新時間:應該瞭解的配置改變(如改變手機方向)

這就是我從這裏聚集和Android文檔:

  1. 使用LoaderManager查詢數據。
  2. 創建ContentProvider(1 & 2使其線程安全)
  3. 在ContentProvider和數據之間放置額外的類。

但是,如何創建,更新和刪除數據?據我所知,LoaderManager僅用於查詢。我應該使用AsyncQueryHandler嗎?

更新: AsyncQueryHandler不知道配置更改。我讀過碎片可能是要走的路。或者...我必須確保我的AsyncQueryHandler實現處理配置更改。

+0

關於目標1:相當困難的,但肯定的,ContentProvider的可以提供從遠程數據庫中,而不是本地SQLite數據庫的內容。聽起來像是一個很好的抽象使用 – zapl

+0

我想問題是,所有這些似乎對我來說是碎片化的。我期待一個LoaderManager處理所有CRUD –

+0

裝載機的一點是,他們是異步加載數據到主線程的效用。他們不打算對C,U或D做任何事情。只是幫助R(eading)。如果你想堅持Android的現有抽象系統,使用ContentProvider,因爲這是一個通用的CRUD接口,不限於任何類型的數據庫。 – zapl

回答

1

(1)非常簡單:只需在ContentProvider和實現所有低級CRUD的數據之間添加一個額外的類即可。例如,一個類可以處理sqlite數據庫,另一個具有相同接口的類可以處理Google驅動器的後端。

做了一些研究之後,這裏是你如何處理(2)和(3)與Android類:

  • 的AsyncTask - 不幸的是,的AsyncTask不知道配置更改,所以你必須編寫你自己(它變得醜陋)。
  • 無頭碎片 - 沒有UI的碎片。你基本上必須編寫你自己的AsyncTaskLoader,這樣才能打破這一點。 (見這裏http://blogactivity.wordpress.com/2011/09/01/proper-use-of-asynctask/
  • AsyncTaskLoader - 似乎是去

裝載機的方式被設計來加載數據,但你可以破解一個Loader也處理插入/更新。 (你可以在loadInBackground()方法中做任何你想做的事情。)

問題是,在HoneyComb之前,所有的Loaders共享一個線程池來並行地執行請求。 (在HoneyComb之後,Loaders按順序執行任務)。這意味着不僅是彼此之後立即執行的任務不能保證按順序執行,而且如果不能正確處理多線程,將會出現數據一致性問題。

如果你在更新數據庫後臺運行一個服務,你還是會擔心在後蜂窩多線程。

的底線是,似乎沒有將Android框架,它抽象掉的「數據庫調用不應該相互衝突」的問題。你必須自己處理。