12

私は Android を学んでいますが、カスタム コンテンツ プロバイダーの呼び出しに関する問題で行き詰まっています。私は教則本の例を使用しており、カスタム プロバイダーの作成方法について説明していますが、特定のメソッドを呼び出す方法の明確な例はありません。カスタム コンテンツ プロバイダーから単一のレコードを削除する方法を具体的に検討しています。

カスタム コンテンツ プロバイダ ( EarthquakeProvider.java) のコードは次のとおりです。

@Override


public int delete(Uri uri, String where, String[] whereArgs) {
int count;

switch (uriMatcher.match(uri)) {
  case QUAKES:
    count = earthquakeDB.delete(EARTHQUAKE_TABLE, where, whereArgs);
    break;

  case QUAKE_ID:
    String segment = uri.getPathSegments().get(1);
    count = earthquakeDB.delete(EARTHQUAKE_TABLE, KEY_ID + "="
                                + segment
                                + (!TextUtils.isEmpty(where) ? " AND (" 
                                + where + ')' : ""), whereArgs);
    break;

  default: throw new IllegalArgumentException("Unsupported URI: " + uri);
}

getContext().getContentResolver().notifyChange(uri, null);
return count;


 }

メイン アクティビティから delete メソッドを呼び出して、データベース全体ではなく単一のエントリを削除しようとしています。OnLongClickListenerメイン アクティビティで配列リスト ビューに表示される選択レコードに対して約 を使用したいと考えています。

これは、私がこれまでにこの方法の主な活動で行ってきたものです。

earthquakeListView.setOnItemLongClickListener(new OnItemLongClickListener() {

    @Override
    public boolean onItemLongClick(AdapterView _av, View _v, int _index,
            long arg3) {
        ContentResolver cr = getContentResolver();
        cr.delete(earthquakeProvider.CONTENT_URI, null, null); 

        return false;
    }

上記のコードが機能しないことはわかっていますが、これは私の現在の理解で得られる限り近いものです。

これに関するヘルプは非常に高く評価されます。

4

1 に答える 1

26
cr.delete(earthquakeProvider.CONTENT_URI, null, null);

これはあなたの問題です。まず、いくつかのコンテキスト:

コンテンツ URI: ( source )

content://authority/path/##

末尾の番号はオプションです。存在する場合、URI は、row._id=(数値) であるデータベース内の特定の行を参照します。存在しない場合は、テーブル全体を参照します。

delete() 呼び出しは、URI、where 句、および置換される一連の文字列を受け入れます。例: 人のデータベースがあるとします。

cr.delete(
   Person.CONTENT_URI, 
   "sex=? AND eyecolor=?", 
   new String[]{"male", "blue"});

person テーブル全体を検索し、性別が男性で目の色が青い人を削除します。

where 句と where 値が null の場合、delete() 呼び出しはtable 内のすべての行に一致します。これにより、表示される動作が発生します。

必要な行を指定するには、次の 2 つの方法があります。

最初のオプションでは、番号を URI に追加できます。

cr.delete(
    EarthquakeProvider.CONTENT_URI.buildUpon().appendPath(String.valueOf(_id)).build(),
    null, null);

これにより、URI が特定の行に制限され、パスはcase QUAKE_ID:ステートメントを通過するため、何があっても 1 つの行のみが削除されます。

2 番目のオプションとして、where 句を使用できます。

cr.delete(EarthquakeProvider.CONTENT_URI, "_id=?", String.valueOf(_id)));

いずれにせよ、必要に応じて削除を 1 行に制限します。後者はよりきれいなコードになりますが、ContentProvider と ContentObservers が機能する方法により、前者はより効率的です。

最後に、ContentProvider で ContentResolver.notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) への呼び出しを追加する必要があります。これは、データベース クエリを再フェッチするようにカーソルに通知するのに役立ち、自動化に大いに役立ちます。

于 2011-03-11T19:19:23.357 に答える