Ответ 1
У вас должен быть один класс SQLiteOpenHelper для всех таблиц. Отметьте эту ссылку.
Лучше ли иметь один большой подкласс SQLiteOpenHelper
, который определяет методы onCreate
и onUpgrade
для каждой таблицы в базе данных или лучше иметь много подклассов SQLiteOpenHelper
, по одному для каждой таблицы?
Есть ли наилучшая практика? Или оба приемлемы, но с разными хорошими и плохими побочными эффектами?
У вас должен быть один класс SQLiteOpenHelper для всех таблиц. Отметьте эту ссылку.
Просто ради другого подхода:
Вы всегда можете переоценить метод 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
@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