2011-02-27 70 views
5

我有一些的Android項目,其中大部分與SQLite數據庫連接。我感興趣的是使用靜態類如「DatabaseHelper.class」,其中我將擁有與數據庫操作相關的所有靜態方法,這是一種很好的編程習慣(或不好的習慣)。例如可以使用靜態「數據庫幫助程序」類嗎?

public static int getId(Context context, String name) { 
    dbInit(context); 

    Cursor result = db.rawQuery("SELECT some_id FROM table WHERE some_name = '" + name + "'", null); 
    result.moveToFirst(); 
    int id = result.getInt(result.getColumnIndex("some_id")); 
    result.close(); 

    return id; 
} 

其中DBINIT(上下文)

private static void dbInit(Context context) { 
    if (db == null) { 
     db = context.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null); 
    } 
} 

後來,當我需要的東西,我可以很容易地調用這些方法(在數據庫manipluation我所有的靜態方法使用) (一個或多個)與例如

int id = DatabaseHelper.getId(this, "Abc"); 

編輯:是否必須在每個連接上使用dbClos​​e或將其保留爲每個活動並關閉每個活動?那麼,我是否已經將上面的代碼更改爲這樣的內容?

... 
    dbClose(); 

    return id; 
} 

private static void dbClose() { 
    if (db != null) { 
     db.close(); 
    } 
} 

回答

6

我建議你進入得到一個數據庫連接每次你需要一個時間,並將其釋放回來時,你用它做的習慣。這種設施的通常名稱是「數據庫連接池」。

這使連接邏輯出你的實際代碼和入池,並讓你當你需要他們做很多事情以後。一件簡單的事情,可能是池記錄了連接對象的使用時間,因此您可以獲取有關數據庫使用情況的信息。

如果您只需要單個連接,則初始池可能非常簡單。

+3

一個池是一個單純的sqlite連接的矯枉過正,因爲那些只需要花費0.2ms打開,所以這樣做,但跳過池 – 2011-02-27 09:40:34

+0

@丹,因此「初始池可以非常簡單」... – 2011-02-27 09:54:02

0

如果你打算使用一個單身的最起碼的要求是,你把它無國籍/線程。如果您使用的getId方法,因爲它代表併發調用可能會導致奇怪的bug的所有方式...

dbInit(context); 

可能需要進行線程A擊中查詢語句之前,然後停止處理。隨後線程B執行getId,並且還調用在不同上下文中傳遞的dbInit。然後線程A會恢復並嘗試在B的上下文上執行查詢。

也許這不是一個問題,在您的應用程序,但我建議你上的getId方法,堅持同步修改!

5

,我肯定有你的數據庫在一個單獨的類相關的代碼,但真的不推薦使用靜態類或單身。由於方便,它可能看起來不錯,但不幸的是,它緊密結合你的類,隱藏它們的依賴關係,並且也使得單元測試更加困難。

在維基百科drawbacks節給你的原因,你可能想探索其他技術小概述。您也可以通過over hereover there來了解如何使用數據庫訪問單例的類的具體示例,以及如何使用依賴注入來解決我提到的一些問題。

作爲第一步,我會建議使用您在構造函數實例化一個普通類,爲前:

public class MyActivity extends Activity {  
    private DBAccess dbAccess; 
    public MyActivity() { 
    dbAccess = new DBAccess(this); 
    }  
} 

第二步,你可能需要調查像RoboGuice框架,以打破硬依賴。你的代碼看起來像這樣:

public class MyActivity extends Activity {  
    @Inject private DBAccess dbAccess; 
    public MyActivity() { 
    }  
} 

讓我們知道你是否想要更多的細節!

相關問題