2011-02-18 69 views
35

我的Android應用程序包含一個SQLite數據庫,其中有一個SQLiteOpenHelper類來幫助管理它。在應用程序使用過程中,用戶可以對數據庫執行一些操作,如添加/刪除/更新等。什麼時候應該在另一個線程(而不是主線程)上執行某些SQLite操作?

在某些點操作的大小將是已知的,這樣的:

  1. 用戶點擊按鈕來保存項目
  2. SQLiteDatabase執行單一insert查詢
  3. 用戶繼續使用應用

在應用程序的其他區域,操作可能很大,例如一次插入10多個項目到數據庫中。

問題:

  • 我應該絲線猶如插入/更新/刪除簡單的操作/觀看第1項?
  • 將1個項目插入包含許多項目(比如30+)的表格中所需的時間比插入沒有項目的表格所需的時間要長?
  • 如果我不需要線程這麼簡單的操作,你建議我在什麼時候開始開始線程?

當我說線程我的意思是使用不是主UI線程的線程。

編輯:我意識到小型操作不需要太多時間,我可以很好地在主線程上完成它們。我只是擔心在主線程中執行它們是一種不好的做法,並且需要澄清!

回答

39

一切規則的一般規則:如果速度夠快,請在主線程上執行。如果沒有,請使用工作線程。

除非你有一個可笑的龐大的數據庫,一個單一的操作幾乎不會保證一個單獨的線程。一般而言,數據庫的設計可以很好地擴展,但是當然一個非常大的數據庫(10,000多行?)會比小數據庫慢一點。然而,30行不算什麼。

如果你有很多操作正在進行,比如一堆查詢或跨越多個表的複雜查詢,我會開始線程化。

與所有內容一樣 - 分析您的應用,如果速度太慢,則優化。如果你的查詢都不超過2ms,就不要編寫一個非常棒的同步超級多核心數據庫處理程序。

+13

怎麼樣在谷歌IO的Android REST客戶端應用程序的談話。他說「從不在主線程的上下文中執行數據庫操作」。我希望我不是在背景下采取這種做法,但這可能是一個很好的做法。 – zidarsk8 2011-07-22 20:40:34

+5

我仍然支持最後一句話 - 不要優化什麼不慢。如果您的數據庫非常小,則不需要優化它。添加多線程會增加您的應用程序的複雜性,併爲難以發現和調試的同步錯誤引入迷人的滋生地。 – EboMike 2011-07-23 01:06:27

+3

使用加載程序,它們現在作爲兼容性庫的一部分提供。 – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 2012-07-17 00:44:22

2

在這裏有一個絕對沒有理由使用線程。只需返回光標,從光標中提取信息並將其返回到主要活動。

具體而言,一個線程是理想的東西,將會重複,直到發生或者超時。由於您使用的數據庫是在電話上使用,因此訪問它幾乎不需要任何時間。

另外,您可以做的另一件事是創建一個Utility類來協助您的活動進行數據庫交互。這將是您的活動調用與數據庫交互的內容。具體的控制流會是這樣:

活動 - >工具 - >數據庫的活動,讓他們相互隔離,並使其更容易訪問,因爲不管它需要數據庫之間

其它不必直接轉到數據庫本身。

6

在您優化之前一定要測量!

確保數據庫操作確實會影響用戶體驗,而不是開始尋找解決方案。

如果數據庫內容變慢,則使用AsyncTask,該設計用於在後臺執行任務,然後更新EDT上的GUI。

相關問題