2736
[Creating a Sync Adapter](http://developer.android.com/training/sync-
adapters/creating-sync-
adapter.html)を始め、`SyncAdapter`について解説している記事では、`AbstractThreadedSyncAdapter`のサブクラスのコンストラクタで、

```

    public SyncAdapter(Context context, boolean autoInitialize) {
      super(context, autoInitialize);
      mContentResolver = context.getContentResolver();
    }
    
```

`ContentResolver`を取得してプライベートなメンバ変数として保持するのがセオリーとしていることが多いです。

しかし、`onPerformSync()`の呼び出しを見ると、

```

    provider = mContext.getContentResolver().acquireContentProviderClient(mAuthority);
    if (provider != null) {
      AbstractThreadedSyncAdapter.this.onPerformSync(mAccount, mExtras, mAuthority, provider, syncResult);
    } else {
      syncResult.databaseError = true;
    }
    
```

このタイミングで`ContentResolver`を取得し、さらに`ContentProviderClient`を獲得して`onPerformSync()`の引数に渡してくれます。コンストラクタで`ContentResolver`を保持するより、引数`provider`を利用して`ContentProvider`を操作した方が効率的なように思えます。

引数`provider`を利用しないのには、何か意味があるのでしょうか？
CC BY-SA 3.0
2014-12-28T05:17:43.597
2721
2014-12-28T09:43:27.770
5337
question
android
SyncAdapterのonPerformSync()の引数ContentProviderClientについて
通常は `ContentProviderClient` を使えば良いです。

リンク先のコードのコメント(英語)にも書いてあるとおり、 `ContextResolver` は **必要ならば取る** べきものです。

```

    /*
     * If your app uses a content resolver, get an instance of it
     * from the incoming Context
     */
    mContentResolver = context.getContentResolver();
    
```

ですから、考えるべきなのは「`ContentProviderClient` を利用しない意味」ではなく「`ContentResolver`
を利用する意味」、すなわち「どういう時に`ContentResolver` を使うのか」です。

この意味にはいくつか考えられるでしょうけれども、 そのうちの1つは両者の違いを考えれば明らかです。 `ContentProviderClient` は1つの
`ContentProvider` へ高速にアクセスできるのに対し、 `ContentResolver` は遅くなるものの全ての
`ContentProvider` へアクセスできます。 同期時に複数の `ContentProvier` からのデータが必要な場合には、
`ContentResolver` が必要になるのです。
CC BY-SA 3.0
2014-12-28T09:31:38.567
2736
2014-12-28T09:43:27.770
2014-12-28T09:43:27.770
208
208
2721
answer