如何在ContentProvider中正确匹配Uri?

时间:2012-06-19 22:01:24

标签: android uri

这就是我所拥有的,但它没有说该表不存在。我很肯定它确实会让任何人问这个问题。但这是一些代码:

什么叫做


/*Constants*/
public static final String AUTHORITY = "content://com.smartcal.eventprovider";
private static final int EVENTS_INFO = 1;
baseUri = Uri.withAppendedPath(baseUri, "events_info");
    return new CursorLoader(this, baseUri, args.getStringArray("projection"), 
            args.getString("selection"), args.getStringArray("selectionArgs"), args.getBoolean("sortOrder") ? args.getString("sortOrder") : null );

匹配的是什么


private String getTable(Uri uri) {
    String table = "";
    switch(sUriMatcher.match(uri)){
    case EVENTS_INFO: table = "events_info";
    }
    return table;
}

private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

static
{
    sUriMatcher.addURI(AUTHORITY, "events_info", 1);

}

自定义query()

中的ContentProvider方法
@Override
public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {
    database = openHelper.getWritableDatabase();

    return database.query(getTable(uri), projection, selection, selectionArgs, null, null, null);
}

错误:


06-19 17:34:14.366: E/AndroidRuntime(686): Caused by: 
java.lang.IllegalStateException: Invalid tables

编辑:

当使用Alex的IllegalArgumentException时,这就是我从错误中得到的:

06-19 19:17:42.277: E/AndroidRuntime(1134): Caused by: 
java.lang.IllegalArgumentException: Unknown URI
content://com.smartcal.eventprovider/events_info

正如您所知,它应该匹配,假设sUriMatcher.addURI()方法正常工作。

2 个答案:

答案 0 :(得分:2)

您的问题可能源于您的代码组织得不好......

首先,

private String getTable(Uri uri) {
    switch(sUriMatcher.match(uri)) {
        case EVENTS_INFO: 
            return "events_info"; // return

        /** PROVIDE A DEFAULT CASE HERE **/
        default:
           // If the URI doesn't match any of the known patterns, throw an exception.
           throw new IllegalArgumentException("Unknown URI " + uri);
    }
}

第二件事,

/** Use constants, not raw ints **/
sUriMatcher.addURI(AUTHORITY, "events_info", EVENT_INFO);

除此之外,您可能想要提供更多信息。

答案 1 :(得分:0)

您是否已经安装了应用程序并且是新表?如果是这样,并且您没有更新sql helper类中的模式,则需要先卸载该应用程序。然后在您的模拟器设备中安装该应用程序。 db只创建一次,即使你正在安装或运行新的build / apk,也不会在第一次调用sql helper中的create方法。