あなたがのContentProviderで行くとパスのアプローチは、私はあなたには、いくつかのヘルパークラスを使用することをお勧めします場合:より良いあなたはあなたのブランドでURIを作成するには、いくつかのヘルパーメソッドを持っているあなたのコンテンツプロバイダでは
public static class UriBuilder{
public static final String FRAGMENT_RAW_UPDATE = "rawUpdate"; // here could be noNotify, conflict resolver pathes, etc.
private Uri.Builder uri;
public UriBuilder(Uri uri){
this.uri = uri.buildUpon();
}
public UriBuilder(String uri){
this.uri = Uri.parse(uri).buildUpon();
}
public UriBuilder append(String path){
uri.appendPath(path);
return this;
}
public UriBuilder append(long id){//points directly to item
uri.appendPath(String.valueOf(id));
return this;
}
public UriBuilder rawUpdate(){
uri.fragment(FRAGMENT_RAW_UPDATE);
return this;
}
public Uri build(){
return uri.build();
}
public static boolean isRawUpdate(Uri uri) {
return FRAGMENT_RAW_UPDATE.equals(uri.getFragment());
}
}
を新しいUriBuilder、のようなもの:あなたのコードの生活の中でこのすべてを持っていた後
public static Uri contentUri(String path, long id){
return new UriBuilder(BASE_URI)
.append(path)
.append(id)//optional
.build();
}
public static Uri contentUriRawUpdate(String path){
return new UriBuilder(BASE_URI)
.append(path)
.rawUpdate()
.build();
}
は私がはるかに簡単だろう。生のアップデートURIを作成するには:
contentResolver.update(YourContentProvider.contentUriRawUpdate(DbContract.Table.CONTENT_URI), null, rawSql, null);
そして最後に、あなたのContentProviderのアップデートで:
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
if(UriBuilder.isRawUpdate(uri)){
dbHelper.getWritableDatabase().update(...);
return;// early exit
}
... // standard logic for matchers here
... // dbHelper.getWritableDatabase().update(...);
... // notify observers here
}
UPDATE: を私はあなたがリスクを理解し、あなたのContentProviderパブリックではないであろうことを示唆しています。このアプローチを使用すると、任意のSQLとバックドアのセキュリティの面で実行できます:)
これはあなた自身の「ContentProvider」ですか?他の人であれば、サポートしているSQL構文があればそれを知る方法がありません。 – CommonsWare
@CommonsWare、ありがとう!その後、おそらく私の質問は、パラメタを必要としないこのタイプの生のSQLを実行する方法をアンドロイドにする必要がありますか? – lannyf
もう一度、あなた自身の 'ContentProvider'ですか?または、他の誰かの 'ContentProvider'に問い合わせていますか? – CommonsWare