Это самые ошеломляющие ошибки, которые я когда-либо имел в своем жизненном программировании. На самом деле это мое худшее до сих пор. Не могу поверить, что я провел 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();
Любая помощь в показывая мне, где я совершил ошибку, будет очень цениться. Я пытался выяснить это в течение четырех дней! Очень расстраивающе.
Спасибо!
вы пытались метод отладки соответствия(), не так ли? Каков был результат? – pskink
Я сделал и его -1, я отправляю содержимое uri этой формы: content: //com.sample.prog/mydatabase/1 Все еще мой UriMatcher не видит этого. –
Спасибо, я снова запустил свой отладчик, и на этот раз я тщательно просмотрел все экземпляры URI до вызова из ContentResolver. Кажется, что он возвращает другое значение, поскольку у меня есть URI, приводящий к как/#, так и/# /, что вызывает неоднозначность. Я решаю это, добавляя id/path в URI. Но решение этого тоже не устранило проблему. Он возвращает путь с% 2EF, и кажется, что обратная косая черта не закодирована, поэтому я использую .appendEncodedPath(). Спасибо за помощь! –