私はアプリを開発しており、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 回作成されることはありません。
contentProviderとcontentResolverの両方を使用する方法については多くの説明がありますが、適切なアップグレードの進行状況はどこにも見つかりませんでした。
onUpgrade がどのように機能するか、および getReadableDatabase ()およびgetWritableDatabase()呼び出し中にチェックされていることは認識していますが、 ContactsDBAdapterは以前と同じインスタンスであるため、バージョンが異なることはありません。
いくつかの回避策を考えましたが、まったく気に入りませんでした。バージョンが高い場合はinsert()中に手動で確認できます(ただし、すべての呼び出しで行われるため、費用がかかります)。答えが真の場合は、onUpgradeを手動で呼び出します。
または、何らかの方法でプロバイダーの登録を解除しようとしましたが、これまで有効で適切な解決策が見つかりませんでした。
DB をアップグレードするためのベスト プラクティスは何ですか?
ありがとう!