Должен ли быть один SQLiteOpenHelper для каждой таблицы в базе данных?

Лучше ли иметь один большой подкласс SQLiteOpenHelper, определяющий методы onCreate и onUpgrade для каждой таблицы в базе данных, или лучше иметь много подклассов SQLiteOpenHelper, по одному для каждой таблицы?

Есть ли лучшая практика? Или оба приемлемы, но с разными хорошими и плохими побочными эффектами?


person Matteo Bononi 'peorthyr'    schedule 14.12.2012    source источник


Ответы (3)


У вас должен быть один класс SQLiteOpenHelper для всех таблиц. Проверьте эту ссылку.

person MysticMagicϡ    schedule 14.12.2012
comment
хорошо, спасибо, вы знаете побочный эффект наличия одного для каждого стола? Или только один файл для редактирования? - person Matteo Bononi 'peorthyr'; 14.12.2012
comment
Спасибо! Я прочитал здесь статью vogella.com/articles/AndroidSQLite/, которая рекомендует использовать подход для каждой таблицы, что, на мой взгляд, абсолютно не имеет смысла, и ваша ссылка подтверждает это. - person Devolus; 25.06.2013
comment
@MysticMagic, спасибо, мне было полезно - person C Sharper; 13.09.2013
comment
Я бы действительно принял во внимание этот комментарий, в котором говорится об объяснении в этом блоге «Android sqliteopenhelper разный класс для каждой таблицы% 23comment36502078_23743888»> stackoverflow.com/questions/23743778/ - person I.G. Pascual; 29.09.2016
comment
Какова стоимость, если мы поддерживаем несколько баз данных для независимых таблиц? Я предполагаю, что все независимые таблицы могут быть перемещены в другую базу данных. - person Uma Sankar; 04.07.2018

Просто ради другого подхода:

Вы всегда можете переопределить метод onOpen(..), чтобы он назывался вашим onCreate(..). Обязательно используйте оператор "CREATE TABLE IF NOT EXISTS...", а не "CREATE TABLE"

    @Override
public void onOpen(SQLiteDatabase db) {
    onCreate(db);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_FRIENDS_TABLE = "CREATE TABLE IF NOT EXISTS ...";
    db.execSQL(CREATE_FRIENDS_TABLE);
}

Вы делаете это с каждым классом, который расширяется от SQLiteOpenHelper.

person Chayemor    schedule 23.03.2014

@TheReader прав. Я предпочитаю один SQLiteOpenHelper для всех таблиц, вот что я делаю: передаю список SQL-запросов «создания таблицы» конструктору подкласса SQLiteOpenHelper, затем в функции onCreate повторяю список для создания каждой таблицы. поэтому мой подкласс SQLiteOpenHelper выглядит примерно так:

public ModelReaderDbHelper(Context context, List<String> createSQLs, List<String> deleteSQLs){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.TABLE_CREATION_SQLS = createSQLs;
        this.TABLE_DELETE_SQLS = deleteSQLs;
    }
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        for(String oneCreation : TABLE_CREATION_SQLS){
            sqLiteDatabase.execSQL(oneCreation);
        }
    }

Но возникает другая проблема: после добавления новой таблицы и установки новой версии приложения с установленной существующей старой новая таблица не будет создана, потому что существование старой базы данных не позволит функции onCreate быть называется. Таким образом, пользователь должен сначала удалить приложение, а затем полностью установить его. DATABASE_VERSION помогает, похоже, Android не будет выполнять функцию onCreate в том и только в том случае, если существующая база данных с тем же именем и той же DATABASE_VERSION

person telmo    schedule 02.05.2014