4

これは機能していました!何が変わったのかわからない。私は git を使用しており、コミットとコードを何時間も調べてきました。

タイトルが示すように、私の uri マッチャーはマッチングを停止しました。

以下に、コンテンツ プロバイダーの関連部分を貼り付けました。

public class Provider extends ContentProvider {
    private static final String TAG = "Provider";
    private static final String SCHEME = ContentResolver.SCHEME_CONTENT;
    private static final String AUTHORITY = "com.snot.bodyweightworkout.database.provider";
    private static final String BASE_URI = SCHEME + AUTHORITY;

    public static final Uri URI_EXERCISES = Uri.parse(BASE_URI + "/exercise");
    public static final Uri URI_PROGRAMS = Uri.parse(BASE_URI + "/program");
    public static final Uri URI_PROGRAM_EXERCISES = Uri.parse(BASE_URI + "/program/#/exercise");

    private static final int EXERCISE = 1;
    private static final int EXERCISES = 2;
    private static final int PROGRAM = 3;
    private static final int PROGRAMS = 4;
    private static final int PROGRAM_EXERCISES = 5;

    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    static
    {
        sURIMatcher.addURI(AUTHORITY, "/exercise", EXERCISES);
        sURIMatcher.addURI(AUTHORITY, "/exercise/#", EXERCISE);
        sURIMatcher.addURI(AUTHORITY, "/program", PROGRAMS);
        sURIMatcher.addURI(AUTHORITY, "/program/#", PROGRAM);
        sURIMatcher.addURI(AUTHORITY, "/program/#/exercise", PROGRAM_EXERCISES);
    }

...

そして、実際のマッチングが行われる部分。

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    Log.v(TAG, "URI: " + uri);
    Cursor result = null;
    int match = sURIMatcher.match(uri);
    switch(match)
    {
        case PROGRAMS:
            result = DatabaseHandler
                .getInstance(getContext())
                .getReadableDatabase()
                .query(Program.TABLE_NAME, Program.FIELDS, null, null, null, null, null, null);
            result.setNotificationUri(getContext().getContentResolver(), URI_PROGRAMS);
            break;
        case PROGRAM:
            final long pid = Long.parseLong(uri.getLastPathSegment());
            result = DatabaseHandler
                .getInstance(getContext())
                .getReadableDatabase()
                .query(Program.TABLE_NAME, Program.FIELDS,
                        Program.COL_ID + " IS ?",
                        new String[] { String.valueOf(pid) }, null, null, null, null);
            result.setNotificationUri(getContext().getContentResolver(), URI_PROGRAMS);
            break;
       ...
        default:
            throw new UnsupportedOperationException("Unmatched(" + match + ") URI: " + uri.toString());

次のようなカーソルローダーを使用してクエリを実行しようとしています:

     getLoaderManager().initLoader(0, null, new LoaderManager.LoaderCallbacks<Cursor>() {
         @Override
         public Loader<Cursor> onCreateLoader(int id, Bundle args) {
             return new CursorLoader(getActivity(), Provider.URI_PROGRAMS, Program.FIELDS, null, null, null);
         }

デフォルトがヒットするたびに。一致しないと、ログに FC と次の行が表示されます。

E/AndroidRuntime( 1979): Caused by: java.lang.UnsupportedOperationException: Unmatched(-1) URI: content://com.snot.bodyweightworkout.database.provider/program

私はこれを何時間も見つめてきましたが、ピークを迎えるには本当に新鮮な目が必要です. ですから、親切な魂がそれを見てくれるなら、私はそれをとても感謝します. 前もって感謝します。

4

1 に答える 1