2011-08-14 114 views
33

在我的活動我有例如爲什麼使用SQLiteOpenHelper而不是SQLiteDatabase?

SQLiteDatabase db = openOrCreateDatabase(Preferences.DB_NAME, Context.MODE_PRIVATE, null); 
db.execSQL("CREATE TABLE IF NOT EXISTS data (id INTEGER PRIMARY KEY, value VARCHAR)"); 
Cursor dbResult = db.rawQuery("SELECT value FROM data", null); 
// do sometning with cursors 
dbResult.close(); 
db.close(); 

什麼用SQLiteOpenHelper

DatabaseHelper helper = new DatabaseHelper(this); 
SQLiteDatabase db = helper.getWriteableDatabase(); 
SQLiteDatabase db_2 = helper.getReadableDatabase(); 
Cursor dbResult = db_2.rawQuery("SELECT value FROM data", null); 
// do sometning with cursors 
dbResult.close(); 
helper.close(); 

類利益本身

public class DatabaseHelper extends SQLiteOpenHelper { 
    public DatabaseHelper(Context context) { 
     super(context, Preferences.DB_NAME, null, Preferences.DB_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String query = "CREATE TABLE IF NOT EXISTS data (id INTEGER PRIMARY KEY, value VARCHAR)"; 
     db.execSQL(query); 
     db.close(); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 
} 

回答

34

SQLiteDatabase

SQLiteDatabase具有創建,刪除,執行SQL命令和執行其他常見數據庫管理任務的方法。

SQLiteOpenHelper

一個輔助類來管理數據庫的創建和版本管理。

我會這麼說,SQLiteOpenHelper自帶的onUpgrade在升級應用程序時非常方便。主要用於創建和升級/版本管理。 SQLiteDatabase主要用於CRUD操作(你可以用它創建,但這是SQLiteOpenHelper的用途)。

+2

傑克說的是對的。請記住'SQLiteOpenHelper'實際上是從'SQLiteDatabase'類中調用靜態方法的。 – dnkoutso

12

SQLiteOpenHelper提供了一些實用程序來簡化創建和初始化數據庫的任務(如果它尚未創建並在應用程序正在升級並且數據庫模式更改時轉換數據庫的內容)。

如果你有一個非常簡單的數據庫模式,那麼它並不能真正幫助你,但對於任何複雜的事情來說,這都是一個明確的幫助。它確保覆蓋所有的邊緣條件,這樣您就不必爲了避免數據庫損壞而將事務放在所有正確的位置。

+10

你能解釋一下你的意思是......「把交易......」。在查看源代碼後,輔助類中沒有太多額外的工作。它檢查是否存在,創建或打開數據庫,檢查版本並調用onCreate/onUpdate。如果您使用SQLiteOpenHelper,那麼圍繞您的語句構建事務仍然取決於您。 –

3

以上是其他答案,SQLiteOpenHelper類中的一個非常重要的功能,它有2個同步方法,getWritableDatabase()getReadableDatabase()

這意味着您的數據庫操作是thread safe。從SQLiteOpenHelper

代碼片段

public SQLiteDatabase getReadableDatabase() { 
    synchronized (this) { 
     return getDatabaseLocked(false); 
    } 
} 

public SQLiteDatabase getWritableDatabase() { 
    synchronized (this) { 
     return getDatabaseLocked(true); 
    } 
} 
0

因爲它是在官方開發者參考

編寫的輔助類來管理數據庫的創建和版本管理。

創建實施的onCreate(SQLiteDatabase)的子類, onUpgrade(SQLiteDatabase,INT,INT)和可選 的OnOpen(SQLiteDatabase),而這個類需要打開 數據庫,如果它存在,如果它不創造它的護理不,並且將其升級爲 必要。事務用於確保數據庫始終處於明智狀態 。

該類使ContentProvider實現可以很容易地將 打開並升級數據庫,直到第一次使用,以避免阻止 應用程序啓動時長時間運行的數據庫升級。

有關示例,請參閱NotePad示例 應用程序中的NotePadProvider類,位於SDK的samples /目錄中。

所以SQLiteOpenHelper使事情變得更容易。

您可以使用此鏈接瞭解如何使用SQLiteOpenHelper處理SQLite。 SQLiteOpenHelper Tutorial

相關問題