2011-11-05 64 views
1

我正在使用我需要在所有活動中訪問的數據庫。所以,我創建了一個類MyDBAdapter與所有打開的方法,創建的getData等等在所有活動中共享相同數據庫的最佳方式

要訪問DB我看到兩種不同的方式:

一個。在每個活動中,我現在寫:MyDBAdapter db = new MyDBAdapter();

這意味着每個活動都會創建一個新的DBAdapter。每個人都會打開相同的數據庫並關閉它。這也意味着相同的數據庫可能會被多個活動打開 - 是嗎?或者,我是否每次切換活動時都要手動確保數據庫已關閉?

b。在第一個活動中只創建一個DBAdapter實例,並每次將其傳遞給下一個活動使用putExtra("Task", x);

然後,數據庫在第一個活動中只打開和關閉一次。

哪一個更好?

非常感謝。

+0

如果您不需要使用DB在不同的應用程序,但只有在你可以使用一個靜態引用,而不是一個動態的同一應用程序的不同活動得到ContentResolver。 – andreapier

回答

1

一般來說,您必須關閉數據庫,完成後使用它(手動調用db.close())。這意味着如果您在多個活動中使用數據庫,則必須在完成使用後每次都關閉它。也就是說,如果您在每個活動中撥打電話MyDBAdapter db = new MyDBAdapter();,則由您決定,否則您將對其進行靜態引用。畢竟,如果在某些代碼塊中有一些局部變量MyDBAdapter db,它將在某個時間點被垃圾收集。

另外一般來說,你不希望你的數據庫操作在你的活動,因爲這樣他們將在UI線程上執行,阻止它,直到他們完成他們的數據庫操作。您可能希望使用AsyncTask作爲您的數據庫操作,它將爲數據庫操作創建單獨的線程(併爲您處理它)。關於使用AsyncTasks,這裏有一個很好的tutorial

+0

我會在每個onPause中做db.close()然後保存嗎?也許有人會檢查它是否已經關閉,如果不是關閉它 - 即使關閉它,即使它已經關閉了? – user387184

+0

你可以在try-catch-finally塊中使用構造if(db.isOpen()) - > db.close()。 – hovanessyan

2

我更喜歡content provider在活動中共享數據。
即使其主要目的是在應用程序之間共享,它可以在我們的單個應用程序內使用。
如果我們使用內容提供者,不用擔心db的關閉和鎖定問題。

Content providersContent providers實現了查詢提供者和返回結果的通用接口 - 以及添加,修改和刪除數據。

它是客戶端間接使用的接口,通常通過ContentResolver對象使用。您可以通過調用getContentResolver()

入住這Simple Content Provider for db operations

+0

謝謝 - 我將在下次考慮它 - 對於目前的應用程序,它只是太多的工作來改變所有的代碼... – user387184

相關問題