在android中获取错误的上下文

时间:2016-10-25 03:41:02

标签: android android-context

我是Android开发人员的新手,我目前正在构建一个带有文本注释和核对清单功能的笔记应用程序。但是,有一个我目前正在混淆的错误。当用户尝试将新项目添加到核对表并且应用程序将该方法路由到不需要的项目时,就会发生这种情况。

我不知道我的代码有什么问题,可能与上下文有关。因此,我将把我的源代码放在这里,希望有人可能会弄明白。感谢您的支持

以下是用户点击添加项目后的相关代码:

NoteEditorActivity

ChecklistManager.newInstance(NoteEditorActivity.this).create(item);

ChecklistManager

public long create(CheckItem item) {
    ContentValues values = new ContentValues();
    values.put(Constants.CL_COL_ID, item.getId());
    //put some data
    Uri result = clContext.getContentResolver().insert(ChecklistContentProvider.CONTENT_URI, values); //BUG: insert command points to notecontentprovider's one
    long id = Long.parseLong(result.getLastPathSegment());
    return id;
}

并且它路由到NoteContentProvider中的insert方法而不是ChecklistContentProvider中的插入方法

public Uri insert(Uri uri, ContentValues values) {
    int type = URI_MATCHER.match(uri);
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    Long id;
    switch (type){
        case NOTES:
            id = db.insert(Constants.NOTES_TABLE, null, values);
            break;
        default:
            throw new IllegalArgumentException("Unknown URI at notecontent: " + uri);
    }
    getContext().getContentResolver().notifyChange(uri, null);
    return Uri.parse(BASE_PATH_NOTE + "/" + id);
}

这是错误

java.lang.IllegalArgumentException: Unknown URI at notecontent: content://cmc.note.data.provider/checklist
                  at cmc.note.data.NoteContentProvider.insert(NoteContentProvider.java:88)
                  at android.content.ContentProvider$Transport.insert(ContentProvider.java)
                  at android.content.ContentResolver.insert(ContentResolver.java)
                  at cmc.note.data.ChecklistManager.create(ChecklistManager.java:43)
                  at cmc.note.activities.NoteEditorActivity$1.onClick(NoteEditorActivity.java:107)
                  at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157)
                  at android.os.Handler.dispatchMessage(Handler.java)
                  at android.os.Looper.loop(Looper.java)
                  at android.app.ActivityThread.main(ActivityThread.java)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
                  at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:163)

2 个答案:

答案 0 :(得分:0)

您的logcat指出了内容://cmc.note.data.provider/checklist'是不知道的uri。检查您的URI_MATCHER,它没有' cmc.note.data.provider / checklist',或者可能是您的开关错误(案例说明)

答案 1 :(得分:0)

当前的问题是您已NoteContentProvider注册了您要查询的权限。 UriMatcherchecklist路径不匹配,因此它会抛出IllegalArgumentException

一般来说,应用程序只需要一个Provider,它根据URI上的路径和ID确定结果数据。您可以轻松地将当前拥有的两个Provider类合并为一个,并合并其UriMatcher设置和CRUD方法。收到请求后,只需使用匹配器确定需要从URI访问哪个表,并相应地执行必要的数据库操作。