【问题标题】:Why use SQLiteOpenHelper over SQLiteDatabase?为什么在 SQLiteDatabase 上使用 SQLiteOpenHelper?
【发布时间】:2011-10-26 20:39:30
【问题描述】:

在我的活动中,例如

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) {
    }
}

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    SQLiteDatabase

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

    SQLiteOpenHelper

    管理数据库创建和版本管理的帮助类。

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

    【讨论】:

    • 杰克所说的是正确的。请记住 SQLiteOpenHelper 实际上是从 SQLiteDatabase 类调用静态方法。
    【解决方案2】:

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

    如果您有一个非常简单的数据库模式,那么它并不能真正为您带来太多好处,但对于任何复杂的东西,它都会有一定的帮助。它确保涵盖所有复杂的边缘条件,因此您不必这样做,例如将事务放在所有正确的位置以避免数据库损坏。

    【讨论】:

    • 您能否解释一下您的意思...“进行交易...”。查看源代码后,辅助类中没有太多额外的工作。它检查存在、创建或打开数据库、检查版本并调用 onCreate/onUpdate。如果您使用 SQLiteOpenHelper,围绕语句构建事务仍然取决于您。
    【解决方案3】:

    在其他答案之上,SQLiteOpenHelper 类中的一个非常重要的特性,它有 2 个同步方法,getWritableDatabase()getReadableDatabase()

    这意味着你的数据库操作是thread safe

    来自SQLiteOpenHelper类的代码sn-p

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

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

    【讨论】:

      【解决方案4】:

      正如官方开发者参考中所写的那样

      管理数据库创建和版本管理的帮助类。

      您创建一个实现 onCreate(SQLiteDatabase) 的子类, onUpgrade(SQLiteDatabase, int, int) 和可选 onOpen(SQLiteDatabase),这个类负责打开 如果存在,则创建数据库,如果不存在,则创建它,并将其升级为 必要的。事务用于确保数据库始终 处于理智状态。

      这个类使得 ContentProvider 实现很容易推迟 打开和升级数据库直到第一次使用,以避免阻塞 使用长时间运行的数据库升级启动应用程序。

      有关示例,请参阅 NotePad 示例中的 NotePadProvider 类 应用程序,在 SDK 的 samples/ 目录中。

      所以 SQLiteOpenHelper 让事情变得非常简单。

      您可以使用此链接了解如何使用 SQLiteOpenHelper 处理 SQLite。 SQLiteOpenHelper Tutorial

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-06
        • 1970-01-01
        • 2013-05-22
        • 2016-09-17
        相关资源
        最近更新 更多