UriMatcher不承认格局 [英] UriMatcher not recognizing pattern

查看:151
本文介绍了UriMatcher不承认格局的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在与匹配的URI的麻烦我的的ContentProvider 。它将匹配一个或两个标签路径(不知道正确的说法是什么),例如,它可以识别盒/#。但只要我添加第二个标记,例如盒/#/项目,我抛出一个 InvalidArgumentException 和我的应用程序崩溃。我在这里上的多个线程,这个问题有时可以通过改变URI的顺序来解决添加到 UriMatcher 阅读;我想这一点,但无济于事。任何人都知道是什么问题?我摘录如下我的code的相关部分。

从我的ContentProvider

 私有静态最后弦乐AUTHORITY =com.example.boxdatabase.DatabaseProvider;
//查询类型
公共静态最终诠释BOXES = 100;
    ...公共静态最终乌里CONTENT_URI = Uri.parse(内容://+ AUTHORITY);
    ...// URI匹配器进行查询
私有静态最终UriMatcher sURIMatcher =新UriMatcher(UriMatcher.NO_MATCH);
静态的 {
    sURIMatcher.addURI(权威盒/#/项,BOX_ITEM);
    sURIMatcher.addURI(权威盒/#/项目/#,BOX_ITEM_ID);
    sURIMatcher.addURI(权威,盒子,箱);
    sURIMatcher.addURI(权威,盒子/#,BOXES_ID);
    sURIMatcher.addURI(权威项目,项目);
    sURIMatcher.addURI(权威项目/#,ITEMS_ID);
}

在那里我试图访问一个例子我的的ContentProvider 和失败:

 返回新CursorLoader(这一点,Uri.withAppendedPath(
                DatabaseProvider.CONTENT_URI,盒子/+ boxId +/项目),
                DatabaseContract.BoxItemEntry.ALL_COLUMNS,NULL,NULL,NULL);


解决方案

试试这个:

  sURIMatcher.addURI(权威,盒子,箱);
sURIMatcher.addURI(权威,盒子/#,BOXES_ID);
sURIMatcher.addURI(权威盒/#/项,BOX_ITEM);
sURIMatcher.addURI(权威盒/#/项目/#,BOX_ITEM_ID);
sURIMatcher.addURI(权威项目,项目);
sURIMatcher.addURI(权威项目/#,ITEMS_ID);

的顺序,在这里看我的解释是很重要的:
http://stackoverflow.com/a/15015687/534471

I'm having trouble with matching URIs in my ContentProvider. It will match paths with one or two "tags" (not sure what the correct term is), for example it can recognize box/#. But as soon as I add a second tag, for example box/#/item, I throw an InvalidArgumentException and my app crashes. I've read in several threads on here that this issue can sometimes be solved by changing the order of the URIs added to the UriMatcher; I tried this, but to no avail. Anyone know what the problem is? I've excerpted relevant parts of my code below.

From my ContentProvider:

private static final String AUTHORITY = "com.example.boxdatabase.DatabaseProvider";
// Type of query
public static final int BOXES = 100;
    ...

public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
    ...

// URI Matcher for queries
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
    sURIMatcher.addURI(AUTHORITY, "box/#/item", BOX_ITEM);
    sURIMatcher.addURI(AUTHORITY, "box/#/item/#", BOX_ITEM_ID);
    sURIMatcher.addURI(AUTHORITY, "box", BOXES);
    sURIMatcher.addURI(AUTHORITY, "box/#", BOXES_ID);
    sURIMatcher.addURI(AUTHORITY, "item", ITEMS);
    sURIMatcher.addURI(AUTHORITY, "item/#", ITEMS_ID);
}

An example of where I try to access my ContentProvider and it fails:

return new CursorLoader(this, Uri.withAppendedPath(
                DatabaseProvider.CONTENT_URI, "box/" + boxId + "/item"),
                DatabaseContract.BoxItemEntry.ALL_COLUMNS, null, null, null);

解决方案

Try this:

sURIMatcher.addURI(AUTHORITY, "box", BOXES);
sURIMatcher.addURI(AUTHORITY, "box/#", BOXES_ID);
sURIMatcher.addURI(AUTHORITY, "box/#/item", BOX_ITEM);
sURIMatcher.addURI(AUTHORITY, "box/#/item/#", BOX_ITEM_ID);
sURIMatcher.addURI(AUTHORITY, "item", ITEMS);
sURIMatcher.addURI(AUTHORITY, "item/#", ITEMS_ID);

The order is important, read my explanations here: http://stackoverflow.com/a/15015687/534471

这篇关于UriMatcher不承认格局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆