这是我整个人生编程中遇到的最令人难以置信的错误。事实上,这是我迄今为止最糟糕的事情。我不相信我已经花了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();
任何有助于向我展示我犯错误的地方将不胜感激。我一直试图弄清楚这四天!但非常令人沮丧。
谢谢!
答案 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);