2011-08-14 117 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

相关问题