Intereting Posts
Изменение позиции меню панели действий в Android Android добавляет MMS в базу данных Возможно ли иметь более одного файла строковых ресурсов в Android? Как получить тело Response при возникновении ошибки при использовании Retrofit 2.0 Observables Разница между представлением AppCompat и обычным представлением Android Определить buildconfigfield для конкретного аромата AND buildType Расширенная панель инструментов с пользовательским представлением, не отображаемым с полной шириной Есть ли способ генерировать файлы ant file local.properties без перезаписи build.xml? Общие настройки Android не сохраняются Как сделать просмотр текста интерактивным в Android? Как вызвать событие, когда scrollView достигает нижней части Android? Как сделать изображение заполнить RelativeLayout фон без растяжки Блок Главная кнопка в бутерброде мороженого и желе Android – Не удалось найти google-play-services_lib.apk! ошибка Ури вернулся после того, как ACTION_GET_CONTENT из галереи не работает в setImageURI () ImageView

Android: можно ли использовать один класс SQLiteOpenHelper для нескольких файлов базы данных?

В моем приложении используются две базы данных (отдельные файлы). Для обработки этих баз данных я создал два класса Helper, которые расширяют SQLiteOpenHelper, по одному для каждой базы данных.

Теперь я собираюсь добавить третью базу данных и задаться вопросом, нужно ли мне создать еще один класс Helper (и если бы я использовал четвертую и пятую базы данных, мне понадобились бы еще больше классов Helper), или я могу использовать тот же класс Helper для нескольких базы данных?

Проблема, которую я вижу при попытке использовать только один класс Helper, заключается в том, что я не вижу, как передать имя отдельных файлов базы данных в Helper. В настоящее время имя базы данных жестко закодировано как статическое поле каждого из классов Helper, но если бы у меня был только один класс Helper, мне нужно было бы передавать разные имена в Constructor при создании отдельного помощника объекты; Проблема в том, что SQLiteOpenHelper Constructor, по-видимому, вызывается Android только одним параметром: Контекст.

Solutions Collecting From Web of "Android: можно ли использовать один класс SQLiteOpenHelper для нескольких файлов базы данных?"

Конечно вы можете. Это всего лишь вопрос вашего класса класса Helper. Вы можете просто передать имя DB в свой конструктор класса Helper (вместе с требуемым экземпляром Context ) вместо hardcoding:

 public class DBOpenHelper extends SQLiteOpenHelper { public DBOpenHelper(Context context, String dbName, int dbVersion) { super(context, dbName, null, dbVersion); } ... } 

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

  • BeginTransaction
  • Запустите создание таблицы с, if not exists (мы делаем обновление, поэтому таблица может еще не существовать, она не изменится и не изменится)
  • Поместить в список существующие столбцы List<String> columns = DBUtils.GetColumns(db, TableName);
  • Таблица резервного копирования ( ALTER table " + TableName + " RENAME TO 'temp_" + TableName )
  • Создать новую таблицу (новейшая схема создания таблицы)
  • Получить пересечение с новыми столбцами, на этот раз столбцы взяты из обновленной таблицы columns.retainAll(DBUtils.GetColumns(db, TableName)); )
  • Восстановить данные ( String cols = StringUtils.join(columns, ","); db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TableName, cols, cols, TableName)); )
  • Удалить таблицу резервного копирования (таблица DROP table 'temp_" + TableName )
  • setTransactionSuccessful

(Это не обрабатывает понижение таблиц, если вы переименовываете столбец, вы не получаете существующие данные, переданные, поскольку имена столбцов не совпадают).

,

 public static List<String> GetColumns(SQLiteDatabase db, String tableName) { List<String> ar = null; Cursor c = null; try { c = db.rawQuery("select * from " + tableName + " limit 1", null); if (c != null) { ar = new ArrayList<String>(Arrays.asList(c.getColumnNames())); } } catch (Exception e) { Log.v(tableName, e.getMessage(), e); e.printStackTrace(); } finally { if (c != null) c.close(); } return ar; } public static String join(List<String> list, String delim) { StringBuilder buf = new StringBuilder(); int num = list.size(); for (int i = 0; i < num; i++) { if (i != 0) buf.append(delim); buf.append((String) list.get(i)); } return buf.toString(); } 

Вы можете просто передать имя DB в свой конструктор класса Helper (вместе с требуемым экземпляром контекста) вместо жесткого кодирования

Вот код:

 /* database helper class */ public class DatabaseOpenHelper extends SQLiteAssetHelper { public DatabaseOpenHelper(Context context,String DATABASE_NAME,int DATABASE_VERSION) { super(context, DATABASE_NAME , null, DATABASE_VERSION); } } /* database access class */ private DatabaseAccess(Context context) { this.openHelper_Anatomy = new DatabaseOpenHelper(context,"Anatomy_hotdata.db",1);//Name of the database 1 this.openHelper_Biochemistry = new DatabaseOpenHelper(context,"Biochemistry_hotdata.db",1); //Name of the database 2 } //instance for database 1 public static DatabaseAccess getInstance_Anatomy(Context context) { if (instance_Anatomy == null) { instance_Anatomy = new DatabaseAccess(context); } return instance_Anatomy; } //instance for database 2 public static DatabaseAccess getInstance_Biochemistry(Context context) { if (instance_Biochemistry == null) { instance_Biochemistry = new DatabaseAccess(context); } return instance_Biochemistry; } /** * Open the database1 connection. */ public void open_Anatomy() { try { this.database_Anatomy = openHelper_Anatomy.getWritableDatabase(); } catch (Exception e) { return; } } /** * Open the database2 connection. */ public void open_Biochemistry() { try { // this.database = openHelper.getWritableDatabase(); this.database_Biochemistry = openHelper_Biochemistry.getWritableDatabase(); } catch (Exception e) { return; } } /** * Close the database connection. */ public void close_Anatomy() { if (this.database_Anatomy != null) { this.database_Anatomy.close(); } } /** * Close the database connection. */ public void close_Biochemistry() { if (this.database_Biochemistry != null) { this.database_Biochemistry.close(); } }