2011-08-02 53 views
6

我對內容提供商有點困惑。 如果我在我的應用程序中有多個活動,他們各自獲取他們自己的內容提供者實例嗎?它只是一個類/接口?Android - sqlite內容提供商和多線程

在一個活動中,我將有許多線程同時寫入數據庫。我該如何處理允許一次寫入一個線程?

難道我只是捕獲SQLiteDatabaseLockedException,把線程睡覺,然後重試? 或者還有更好的方法嗎?

當活動暫停/被銷燬時,是否釋放數據庫鎖定?如果是這樣,我可以只針對內容提供者本身創建一個同步鎖定?

回答

-4

如果您使用的是ContentProvider,我相信您不在乎有多少個線程正在讀/寫:Android平臺會將您所有的調用整理到單個線程中,並整理出同步和鎖定。您只需打開數據庫並讀/寫數據庫,其他人都通過ContentProvider界面進行交談。

+5

Android文檔「因爲這些ContentProvider方法可以從不同的進程和線程中的各種ContentResolver對象調用,所以它們必須以線程安全的方式實現。」 – kakopappa

+1

這是不正確的。 Android平臺沒有這樣的事情。 –

+0

嗯,聲望50.5k和這樣的答案? –

1

糟糕,我丟失了我的未註冊用戶cookie,因此無法投票Femi的回答正確。

文檔http://developer.android.com/guide/topics/providers/content-providers.html證實了這一點與 「當啓動查詢,Android系統識別的內容提供商是查詢的目標,並確保其正常運行的系統實例化所有的ContentProvider對象;你從來沒有需要自己做,事實上,你從不直接處理ContentProvider對象,通常每種類型的ContentProvider只有一個實例,但它可以與不同的應用程序和進程中的多個ContentResolver對象通信。在進程之間由ContentResolver和ContentProvider類處理。「

+1

如果您將您的問題/答案標記爲管理員注意力並選擇其他人,您可以請求合併這兩個賬戶。您可能還想考慮註冊:) – forsvarir

3

如果您直接使用數據庫並且有不同的作者你可能遇到併發問題。

ContentProvider可以同時從多個程序訪問,因此您必須實現線程安全訪問。最簡單的方法是在ContentProvider的所有方法之前使用關鍵字​​,以便只有一個線程可以同時訪問這些方法。

如果您不需要Android將ContentProvider的數據訪問同步,請在AndroidManifest.xml文件的<provider>定義中設置android:multiprocess=true屬性。這允許在每個客戶端進程中創建提供程序的實例,從而不需要執行進程間通信(IPC)。

+1

是的它確實如此:http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html –

+0

我不明白,所以如果我沒有設置multiprocess = true android會同步所有對ContentProvider的訪問?在這種情況下,不需要使用synchronized關鍵字,對吧?在這種情況下費米的答案是正確的? – Gus