Я разрабатываю приложение и использую SQLite, contentResolver и contentProvider.Обновление SQLite DB в Android с помощью ContentProvider
Описание приложения Приложение выполняет поиск контактов во внутренней SQLite DB. данные поступают из внешнего файла, который выбран на первом обеденном перерыве или когда пользователь нажимает кнопку обновления в меню.
Весь доступ к БД осуществляется с помощью метода getContentResolver().
ContentProvider У меня есть ContactsContentProvider класс, который расширяет ContentProvider и содержит ссылку на ContactsDBAdapter, который мой адаптер базы данных, которая расширяет SQLiteOpenHelper. (Надеюсь, вы все со мной до сих пор).
Описание проблемы Когда пользователь нажимает кнопку обновления я хочу DB, чтобы удалить все таблицы и загрузить новые данные (это делается с помощью моего файлового броузера и работает отлично). для того, чтобы onUpgrade() в моем ContactsDBAdapter работать поставщик контента OnCreate() должен вызываться с более высокой версией, то, что она имела в своем распоряжении
@Override
public boolean onCreate() {
context = getContext();
pref = PreferenceManager.getDefaultSharedPreferences(context);
int dbVersion = pref.getInt(Settings.DB_VERSION, 1);
mDb = new ContactsDBAdapter(context,dbVersion);
return (mDb == null)? false : true;
}
Но я получаю ContentProvider из мой contentResolver поэтому он не создается дважды.
Хотя есть много объяснений о том, как использовать оба ContentProvider и contentResolver я не нашел нигде хороший прогресс обновления.
Я знаю, как работает onUpgrade и что проверяется во время getReadableDatabase() и getWritableDatabase() вызовов, но дело в том, что версия не будет Diferent поскольку ContactsDBAdapter является тот же экземпляр, что и раньше.
Я думал о некоторых работах вокруг, но им совсем не нравились. Я могу проверить вручную во время вставки(), если версия выше (но это было бы дорого, поскольку это делается каждым вызовом), и если ответ верен, тогда вручную вызовите onUpgrade.
или попытаться отменить регистрацию Провайдера в некотором роде, но пока не нашли действительного и хорошего решения.
Какова наилучшая практика для обновления базы данных?
Спасибо!
Это делается, когда пользователь нажимает кнопку обновления, как вы CaC смотрите здесь: \t OnClick общественной недействительным (диалог DialogInterface, внутр который) {// \t \t \t \t \t \t \t dialog.dismiss(); \t \t \t \t \t \t \t INT newVersion = preferences.getInt (Settings.DB_VERSION, 1) + 1; \t \t \t \t \t \t \t Редактор editor = preferences.edit(); \t \t \t \t \t \t \t editor.putInt (Settings.DB_VERSION, newVersion); \t \t \t \t \t \t \t Log.i ("Обновить", "Обновление версии БД версии:" + newVersion); \t \t \t \t \t \t \t editor.commit(); \t \t \t \t \t \t \t \t \t \t \t \t \t lunchFileChooser(); \t \t \t \t \t \t} – Ika
Hi Vince. Я не уверен, что мой ответ был правильно понят. Ваше предложение состояло в том, чтобы обновить версию, когда я хочу обновить БД (при следующем обращении к getReadableDatabase), но это будет ** не ** (потому что это именно то, что я делаю) это связано с тем, что onCreate contentResolver не вызывается для каждого вызова, и поэтому версия БД не будет обновляться. – Ika