Зачем использовать SQLiteOpenHelper поверх SQLiteDatabase? - PullRequest
37 голосов
/ 14 августа 2011

В моей деятельности у меня есть, например,

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

Ответы [ 4 ]

38 голосов
/ 14 августа 2011

SQLiteDatabase

SQLiteDatabase имеет методы для создания, удаления, выполнения команд SQL и выполнения других общих задач управления базой данных.

SQLiteOpenHelper

Вспомогательный класс для управления созданием базы данных и управлением версиями.

Скажу так: onUpgrade, входящий в состав SQLiteOpenHelper, действительно ДЕЙСТВИТЕЛЬНО удобенпри обновлении вашего приложения.Это в основном для создания и обновления / управления версиями.SQLiteDatabase в основном для CRUD-операций (вы можете создавать с помощью него, но для этого предназначен SQLiteOpenHelper).

12 голосов
/ 15 августа 2011

SQLiteOpenHelper предоставляет утилиты для упрощения задач создания и инициализации базы данных, если она еще не создана, и преобразования содержимого базы данных при обновлении приложения и изменении схемы базы данных.

Если у вас оченьПростая схема базы данных, тогда это не очень много, но для чего-то сложного это определенная помощь.Он гарантирует, что все непростые граничные условия выполняются так, что вам не нужно, например, размещать транзакции во всех нужных местах, чтобы избежать повреждения базы данных.

5 голосов
/ 27 августа 2016

Помимо других ответов, одна очень важная особенность в классе SQLiteOpenHelper, она имеет 2 синхронизированных метода, getWritableDatabase() и getReadableDatabase().

Это означает, что ваши операции с базой данных поточно-безопасны .

Фрагмент кода из SQLiteOpenHelper класс

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

и

public SQLiteDatabase getWritableDatabase() {
    synchronized (this) {
        return getDatabaseLocked(true);
    }
}
0 голосов
/ 22 ноября 2017

Как написано в официальной справке разработчика

Вспомогательный класс для управления созданием базы данных и управления версиями.

Вы создаете подкласс, реализующий onCreate (SQLiteDatabase), onUpgrade (SQLiteDatabase, int, int) и, возможно, onOpen (SQLiteDatabase), и этот класс заботится об открытии базы данных, если она существует, ее создании, если она не существует, и об обновлении ее при необходимости.Транзакции используются для того, чтобы убедиться, что база данных всегда находится в разумном состоянии.

Этот класс позволяет реализациям ContentProvider откладывать открытие и обновление базы данных до первого использования, чтобы избежать блокировки запуска приложения с долго работающей базой данных.Обновления.

Например, см. класс NotePadProvider в примере приложения NotePad в каталоге samples / SDK.

Так что SQLiteOpenHelper значительно упрощает работу.

Вы можете использовать эту ссылку, чтобы узнать, как работать с SQLite с помощью SQLiteOpenHelper. Учебник по SQLiteOpenHelper .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...