Java UriMatcher没有';不匹配

Java UriMatcher没有';不匹配,java,android,uri,android-contentprovider,Java,Android,Uri,Android Contentprovider,首先:我已经筛选了很多关于SO的问题,但仍然没有找到正确的答案 以下是我的代码的(简化)版本: private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); private static final int HOMEWORK_TABLE_REQUEST = 1, CLASS_TABLE_REQUEST = 2, SETTINGS_TABLE_

首先:我已经筛选了很多关于SO的问题,但仍然没有找到正确的答案

以下是我的代码的(简化)版本:

private static UriMatcher
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

private static final int
        HOMEWORK_TABLE_REQUEST = 1,
        CLASS_TABLE_REQUEST = 2,
        SETTINGS_TABLE_REQUEST = 3,
        HOMEWORK_ITEM_REQUEST = 4,
        CLASS_ITEM_REQUEST = 5,
        SETTINGS_ITEM_REQUEST = 6;

static {
    uriMatcher.addURI("org.dvc.homeworkReminder.homeworkProvider", "homework", HOMEWORK_TABLE_REQUEST);
    uriMatcher.addURI("org.dvc.homeworkreminder.homeworkProvider", "homework/#", HOMEWORK_ITEM_REQUEST);
    uriMatcher.addURI("org.dvc.homeworkReminder.homeworkProvider", "class", CLASS_TABLE_REQUEST);
    uriMatcher.addURI("org.dvc.homeworkreminder.homeworkProvider", "class/#", CLASS_ITEM_REQUEST);
    uriMatcher.addURI("org.dvc.homeworkReminder.homeworkProvider", "settings", SETTINGS_TABLE_REQUEST);
    uriMatcher.addURI("org.dvc.homeworkreminder.homeworkProvider", "settings/#", SETTINGS_ITEM_REQUEST);
}
下面是我的查询方法:

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    Cursor cursor = null;   
    Log.i("dfg", "Query method called");
    Log.i("dfg", "Uri = " + uri.toString());
    Log.i("dfg", "Match: " + uriMatcher.match(uri));
    switch(uriMatcher.match(uri)) {
        case HOMEWORK_ITEM_REQUEST:
            Log.i("dfg", "HOMEWORK_ITEM_REQUEST");
            cursor = database.readCursorById(Integer.parseInt(uri.getLastPathSegment()));
            break;
        case HOMEWORK_TABLE_REQUEST:
            Log.i("dfg", "HOMEWORK_TABLE_REQUEST");
            cursor = database.readAllHomework();
            break;
        case CLASS_ITEM_REQUEST:
        case CLASS_TABLE_REQUEST:
        case SETTINGS_ITEM_REQUEST:
        case SETTINGS_TABLE_REQUEST:
            cursor = null;
            break;
        default:
            cursor = null;
            break;
    }
    return cursor;
}
我没有类请求或设置请求的实现,所以我只是默认返回
null
。发生的事情是,我的
switch
语句一直下降到
default:
,并导致后来在我的代码中出现大量NPE。您会注意到在我的代码中有5个
Log
语句。以下内容打印到LogCat。(为什么它被称为logcat呢?)

现在测试的uri应该与我添加的第二个模式匹配,对吗?我还了解了
Uri.parse()
方法如何在另一个线程上处理
UriMatcher
的通配符,因此我使用以下代码构建上面打印的
Uri

Uri returnUri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority("org.dvc.homeworkReminder.homeworkProvider").appendPath("homework").appendPath(String.valueOf(id)).build();
那里的
id
变量取决于其他一些不相关的东西

我的问题是为什么
UriMatcher
不工作,我该如何着手修复它

修正: 我在以下行中的大写字母不正确:

uriMatcher.addURI("org.dvc.homeworkreminder.homeworkProvider", "homework/#", HOMEWORK_ITEM_REQUEST);
uriMatcher.addURI("org.dvc.homeworkreminder.homeworkProvider", "class/#", CLASS_ITEM_REQUEST);
uriMatcher.addURI("org.dvc.homeworkreminder.homeworkProvider", "settings/#", SETTINGS_ITEM_REQUEST);

请注意
家庭作业提醒
中的小写字母
r
。感谢布鲁斯发现了它

您在设置匹配器时使用小写的“提醒”,但实际的URI使用大写的“提醒”。

匹配器返回的是“负一”,而不是“一”?匹配器返回的是负一,根据JavaDoc,它在找不到匹配时会做什么。啊,我明白了,这就是问题所在-您希望它匹配。我错了,是的。我是否在
addUri()
中正确地组装了模式?我不是专家,但我注意到在设置匹配器时您有小写的“提醒”,但实际的URI有大写的“提醒”。我不确定这是否重要。
uriMatcher.addURI("org.dvc.homeworkreminder.homeworkProvider", "homework/#", HOMEWORK_ITEM_REQUEST);
uriMatcher.addURI("org.dvc.homeworkreminder.homeworkProvider", "class/#", CLASS_ITEM_REQUEST);
uriMatcher.addURI("org.dvc.homeworkreminder.homeworkProvider", "settings/#", SETTINGS_ITEM_REQUEST);