11

このドキュメントには、プロバイダーが正常に読み込まれた場合はtrueを返し、それ以外の場合はfalseを返す必要があると記載されています。私の実装では、DatabaseHelper==nullの場合はfalseを返します。

DatabaseHelper == nullfalseがonCreateで返され、後でコードのどこかでプロバイダーにクエリを実行すると、プロバイダーはまだクエリされており、クラッシュする可能性があります。

私の質問は、ContentProviderのOnCreateでfalseを返すための使用法は何ですか?また、onCreateが失敗した後、クエリをどのように処理する必要がありますか?onCreate inクエリを再度実行しますか?

4

1 に答える 1

12

ContentProvider の OnCreate で false を返す用途は何ですか?

Android ソースをすばやくナビゲートすることで、のところ、何を返すかは問題ではなく、無視されるだけあることがわかりました。

テストActivityThreadattachInfoは と が直後に呼び出されるnewInstanceため、ContentProviderソースの 1058 行目でonCreateが呼び出され、次のようになります。

/**
 * After being instantiated, this is called to tell the content provider
 * about itself.
 *
 * @param context The context this provider is running in
 * @param info Registered information about this content provider
 */
public void attachInfo(Context context, ProviderInfo info) {
    /*
     * We may be using AsyncTask from binder threads.  Make it init here
     * so its static handler is on the main thread.
     */
    AsyncTask.init();

    /*
     * Only allow it to be set once, so after the content service gives
     * this to us clients can't change it.
     */
    if (mContext == null) {
        mContext = context;
        mMyUid = Process.myUid();
        if (info != null) {
            setReadPermission(info.readPermission);
            setWritePermission(info.writePermission);
            setPathPermissions(info.pathPermissions);
            mExported = info.exported;
        }
        ContentProvider.this.onCreate();
    }
}

ドキュメントにそのように記載されている場合は、将来のリリースで使用/修正される可能性があることに注意してください。


onCreate が失敗した後、クエリをどのように処理すればよいですか? クエリで onCreate をもう一度実行するだけですか?

はい、必ずしもそうではありませんonCreateが、一度初期化してあなたDatabaseHelperかそこらを保証するあなた自身の方法は、あなたの最善の努力です.onCreate

重要な初期化 (データベースのオープン、アップグレード、スキャンなど) は、コンテンツ プロバイダーが使用されるまで延期する必要があります。

技術的には意図したとおりにやっているはずですが、そこはワイルドなので安全に気をつけてください。

于 2013-06-12T00:50:18.093 に答える