1

Я разрабатываю приложение и использую 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.

или попытаться отменить регистрацию Провайдера в некотором роде, но пока не нашли действительного и хорошего решения.

Какова наилучшая практика для обновления базы данных?

Спасибо!

ответ

0

я нашел хорошее решение. В моей ContactsContentProvider который простирается ContentProvider Я добавил sharedPrefencesListener

@Override 
public boolean onCreate() { 
     context = getContext(); 
     pref = PreferenceManager.getDefaultSharedPreferences(context); 
     int dbVersion = pref.getInt(Settings.DB_VERSION, 1); 
     mDb = new ContactsDBAdapter(context,dbVersion); 
     pref.registerOnSharedPreferenceChangeListener(sharedPrefListener) ; 
     return (mDb == null)? false : true; 
} 
SharedPreferences.OnSharedPreferenceChangeListener sharedPrefListener = 
    new SharedPreferences.OnSharedPreferenceChangeListener() { 

    @Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
    String key) { 
    if(key.equals(Settings.DB_VERSION)){ 
    int dbVersion = sharedPreferences.getInt(Settings.DB_VERSION, 1); 
    synchronized (mDb) { 
      mDb.close();//Not sure this is the right behavior 
     mDb = new ContactsDBAdapter(context,dbVersion); 
    } 
    } 
} 
}; 

Теперь, когда пользователь изменяет номер версии в моей основной деятельности я установить номер версии. Это вызовет новый ContactDBAdapter, который затем вызовет onUpgrade в следующий раз, когда кто-то захочет getReadableDatabase() или getWriteableDatabase().

1

Я хотел бы предложить вам обновить общие предпочтения изменить версию БД и добавить его:

SharedPreferences.Editor ed = pref.edit(); 
ed.putInt(Settings.DB_VERSION, dbVersion + 1); 
ed.commit(); 

Надеюсь, это поможет вам

+0

Это делается, когда пользователь нажимает кнопку обновления, как вы 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

+0

Hi Vince. Я не уверен, что мой ответ был правильно понят. Ваше предложение состояло в том, чтобы обновить версию, когда я хочу обновить БД (при следующем обращении к getReadableDatabase), но это будет ** не ** (потому что это именно то, что я делаю) это связано с тем, что onCreate contentResolver не вызывается для каждого вызова, и поэтому версия БД не будет обновляться. – Ika