2012-12-11 5 views
11

文書には、プロバイダが正常に読み込まれた場合はtrueを返し、そうでない場合はfalseを返します。私の実装では、DatabaseHelper == nullの場合はfalseを返します。ContentProviderのOnCreateでfalseを返すとどうなりますか?

は今DatabaseHelper == nullと偽はのonCreateで返されると仮定し、後でコードのどこかのプロバイダに照会し、プロバイダはまだ照会されるとだってのそれがクラッシュしていました。

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

答えて

12

ContentProviderのOnCreateでfalseを返すにはどうすればよいですか?

はすぐにAndroidのソースをナビゲートすることで、私は用として、実際にそれが今用として再びを無視します、あなたが返す何問題ではない、ことがわかりました。

テストに

ActivityThreadattachInfoは右newInstance後に呼び出されますがContentProviderソースat line 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

のマニュアルに従って意味コンテンツプロバイダが使用されるまで、重要な初期化(データベースのオープン、アップグレード、スキャンなど)を延期する必要があります。

技術的には意図的にやっていますが、ここで安全です。

+0

申し訳ありませんが遅く受け入れ、素敵な答え! – Bear

関連する問題