2015-04-07 151 views
0

這是我在整個編程中遇到的最令人難以置信的錯誤。事實上,這是迄今爲止我最糟糕的一次。簡直不敢相信我已經花了4天時間,而且我還是一無所獲。我當然錯過了什麼。Android URI不匹配

這裏是從我的代碼的權限和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。所以我很困惑我的content-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(); 

在顯示我的任何幫助,我犯的錯誤,將不勝感激。我一直試圖弄清楚這個四天!雖然非常令人沮喪。

謝謝!

+2

你試圖調試match()方法,不是嗎?結果是什麼? – pskink

+0

我做了,它的-1,我發送這種形式的內容URI:content://com.sample.prog/mydatabase/1我的UriMatcher仍然看不到這個。 –

+0

謝謝我再次運行我的調試器,這次我仔細查看了URI的所有實例,直到ContentResolver的調用。它似乎正在返回不同的值,因爲我的URI導致/#和/#/這導致模糊。我通過向URI添加ID /路徑來解決此問題。但解決這個問題也沒有解決問題。它返回一個帶有%2EF的路徑,看起來反斜槓沒有編碼,所以我使用.appendEncodedPath()代替。謝謝您的幫助! –

回答

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);