Android URI不匹配

时间:2015-04-07 10:29:48

标签: android

这是我整个人生编程中遇到的最令人难以置信的错误。事实上,这是我迄今为止最糟糕的事情。我不相信我已经花了4天时间,我仍然没有想出任何东西。我当然错过了一些东西。

以下是我的代码中的AUTHORITY和CONTENT_URI变量:

    public static final String AUTHORITY = "com.neonwarge.android.note.providers";
public static final Uri CONTENT_URI  = Uri.parse("content://" + AUTHORITY + "/" + NoteDatabaseHelper.NoteEntry.TABLE_NAME);

我已经阅读了很多帖子,他们都是针对他们的问题所特有的,这些问题在我的案例中并不是很普遍而且非常无益。

所以这是我的URI代码:

    static
{       
    mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME, NOTES);

    // This never gets detected
    mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/#", NOTES_ID);
    //

    mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/#/", ALL_NOTES_BY_YEAR);
    mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/#/*", ALL_NOTES_BY_YEAR_MONTH);
    mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/#/*/#", ALL_NOTES_BY_YEAR_MONTH_DAY);

    mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/count/" , NOTE_COUNT);
    mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/count/#/", NOTE_COUNT_BY_YEAR);
    mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/count/#/*/", NOTE_COUNT_BY_YEAR_MONTH);
    mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/count/#/*/#", NOTE_COUNT_BY_YEAR_MONTH_DAY);

    mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/position/#", NOTE_POSITION);
    mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/percount/", NOTE_PERCOUNT_BY_ALL_YEARS);
    mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/percount/#/", NOTE_PERCOUNT_BY_ALL_MONTHS);
    mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/percount/#/*/", NOTE_PERCOUNT_BY_ALL_DAYS);
}

当我调用contentResolver时,它永远不会检测到NOTES_ID模式。所以我很困惑我的内容 - uri匹配是否完全错误。这里的概念是,如果我的路径是

content://com.sample.prog/mydatabase/1

这意味着我需要从' dmydatabasetabase'中删除ID = 1的条目。对于NOTES_ID,情况并非如此,URI匹配器返回-1,这就是为什么在我的代码中它永远不会触及NOTES_ID情况。

以下是我打电话的方式:

    Uri uri = NoteProvider.CONTENT_URI.buildUpon().appendPath(String.valueOf(noteID)).build();

任何有助于向我展示我犯错误的地方将不胜感激。我一直试图弄清楚这四天!但非常令人沮丧。

谢谢!

1 个答案:

答案 0 :(得分:0)

感谢@pksink的帮助和建议。

所以这次调试器再次运行两次,并仔细检索所有URI,直到调用ContentResolver。罪魁祸首是:

mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/#", NOTES_ID);
mUriMatcher.addURI(AUTHORITY , NoteDatabaseHelper.NoteEntry.TABLE_NAME + "/#/", ALL_NOTES_BY_YEAR);

正如你所看到的,我有/#和/ / /的两个路径,这会引起歧义,作为回报,匹配器返回后者的类型,我的交换机案例没有过滤。现在我通过添加/ id路径来解决这个问题。它也没有解决问题。附加路径始终如下:

<blah><blah><mypath>%2EFid

我注意到反斜杠没有编码,所以在我的请求URI字符串上,我将.appendPath更改为appendEncodedPath,这解决了我所有的URI问题!

以下是代码的样子:

    Uri uri = NoteProvider.CONTENT_URI.buildUpon().appendEncodedPath("id/" + String.valueOf(noteID)).build();
    int affectedRows = mContentResolver.delete(uri, selection, selectionArgs);