1

私はアプリを開発しており、SQLite、contentResolver、および contentProvider を使用しています。

アプリケーションの説明 私のアプリは、内部 SQLite DB で連絡先を検索します。データは、最初の昼食時またはユーザーがメニューの更新オプションを押したときに選択された外部ファイルから到着します。

DB へのすべてのアクセスは getContentResolver() を使用して行われます。

ContentProvider ContentProvider 拡張し、 SQLiteOpenHelperを拡張するデータベース アダプターであるContactsDBAdapterへの参照を保持するContactsContentProviderクラスがあります。(私はあなたが今まで私と一緒にいたことを願っています).

問題 の説明 ユーザーが更新ボタンを押したときに、DB がすべてのテーブルを削除して新しいデータをロードするようにします (これはファイル チューザーによって行われ、うまく機能します)。ContactsDBAdapterのonUpgrade()を機能させるには、コンテンツ プロバイダーの 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;
}

しかし、contentResolverからcontentProviderを取得するので、2 回作成されることはありません。

contentProvidercontentResolverの両方を使用する方法については多くの説明がありますが、適切なアップグレードの進行状況はどこにも見つかりませんでした。

onUpgrade がどのように機能するか、および getReadableDatabase ()およびgetWritableDatabase()呼び出し中にチェックされていることは認識していますが、 ContactsDBAdapterは以前と同じインスタンスであるため、バージョンが異なることはありません。

いくつかの回避策を考えましたが、まったく気に入りませんでした。バージョンが高い場合はinsert()中に手動で確認できます(ただし、すべての呼び出しで行われるため、費用がかかります)。答えが真の場合は、onUpgradeを手動で呼び出します。

または、何らかの方法でプロバイダーの登録を解除しようとしましたが、これまで有効で適切な解決策が見つかりませんでした。

DB をアップグレードするためのベスト プラクティスは何ですか?

ありがとう!

4

2 に答える 2

1

共有設定を更新してdbバージョンを変更し、追加することをお勧めします。

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

うまくいけば、それはあなたを助けます

于 2012-04-21T21:38:55.700 に答える
0

素敵な解決策を見つけました。ContentProviderを拡張するContactsContentProviderに、 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);
    }
   }
}
};

ユーザーがメイン アクティビティでバージョン番号を変更すると、バージョン番号が設定されます。これにより、新しい ContactsDBAdapter が呼び出され、次に getReadableDatabase() または getWriteableDatabase() が必要になったときに onUpgrade が呼び出されます。

于 2012-04-22T17:44:56.480 に答える