为什么使用SQLiteOpenHelper而不是SQLiteDatabase?

sve*_*ija 37 sqlite android

在我的活动中,我有例如

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();
Run Code Online (Sandbox Code Playgroud)

什么是使用的好处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();
Run Code Online (Sandbox Code Playgroud)

类本身

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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

Jac*_*ack 38

SQLiteDatabase

SQLiteDatabase具有创建,删除,执行SQL命令以及执行其他常见数据库管理任务的方法.

SQLiteOpenHelper

用于管理数据库创建和版本管理的帮助程序类.

我会说这么多,SQLiteOpenHelper附带的onUpgrade在升级你的应用程序时非常方便.它主要用于创建和升级/版本管理.SQLiteDatabase主要用于CRUD操作(您可以使用它创建,但这是SQLiteOpenHelper的用途).

  • 杰克说的是对的.请记住`SQLiteOpenHelper`实际上是从`SQLiteDatabase`类调用静态方法. (3认同)

Dav*_*ven 12

SQLiteOpenHelper提供的实用程序可以简化创建和初始化数据库的任务(如果尚未创建),并在应用程序升级和数据库架构更改时转换数据库的内容.

如果你有一个非常简单的数据库模式,那么它并没有真正让你得到太多,但对于任何复杂的,它都是一个明确的帮助.它确保涵盖所有繁琐的边缘条件,以便您不必这样做,例如将事务放在所有正确的位置以避免数据库损坏.

  • 你能解释一下你的意思......"把交易......".在查看源代码之后,辅助类中没有太多额外的工作.它检查是否存在,创建或打开数据库,检查版本并调用onCreate/onUpdate.如果您使用SQLiteOpenHelper,那么围绕您的语句构建事务仍然取决于您. (11认同)

may*_*ʎɐɯ 5

在其他答案之上SQLiteOpenHelper,这是课堂上一个非常重要的功能,它有 2 个同步方法getWritableDatabase()getReadableDatabase().

这意味着您的数据库操作是线程安全的

SQLiteOpenHelper类的代码片段

public SQLiteDatabase getReadableDatabase() {
    synchronized (this) {
        return getDatabaseLocked(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

public SQLiteDatabase getWritableDatabase() {
    synchronized (this) {
        return getDatabaseLocked(true);
    }
}
Run Code Online (Sandbox Code Playgroud)