2015-04-07 3 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); 

Я много читал пост, все они специфичны для их проблем не очень общих и очень бесполезных в моем случае.

Так вот мой код URIs:

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 

Это означало бы, мне нужно, чтобы удалить запись с ID = 1 из «dmydatabasetabase». Вместо этого вместо NOTES_ID это не так, URI Matcher возвращает -1, поэтому в моем коде он никогда не касается случая NOTES_ID.

Вот как я его назвал:

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

Любая помощь в показывая мне, где я совершил ошибку, будет очень цениться. Я пытался выяснить это в течение четырех дней! Очень расстраивающе.

Спасибо!

+2

вы пытались метод отладки соответствия(), не так ли? Каков был результат? – pskink

+0

Я сделал и его -1, я отправляю содержимое uri этой формы: content: //com.sample.prog/mydatabase/1 Все еще мой UriMatcher не видит этого. –

+0

Спасибо, я снова запустил свой отладчик, и на этот раз я тщательно просмотрел все экземпляры URI до вызова из ContentResolver. Кажется, что он возвращает другое значение, поскольку у меня есть URI, приводящий к как/#, так и/# /, что вызывает неоднозначность. Я решаю это, добавляя id/path в URI. Но решение этого тоже не устранило проблему. Он возвращает путь с% 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); 
Смежные вопросы