Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Вы всегда можете переоценить метод 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

Ответ 3

@TheReader прав. Я предпочитаю один SQLiteOpenHelper для всех таблиц, вот что я делаю: передайте список "создания таблицы" sqls в конструктор подкласса 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 помогает, кажется, что андроид не будет выполнять функцию onCreate тогда и только тогда, когда существует база данных с одним и тем же именем и одна и та же DATABASE_VERSION