在 android 中获取错误的上下文

Get wrong context in android

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

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

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

NoteEditorActivity

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

清单管理器

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 中的插入方法,而不是 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.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)

您的 logcat 指出 'content://cmc.note.data.provider/checklist' 是未知的 uri。检查您的 URI_MATCHER,它没有 'cmc.note.data.provider/checklist',或者可能是您的开关有误(案例注释)

眼前的问题是您已经 NoteContentProvider 注册了您正在查询的权限。 UriMatcher 没有匹配 checklist 路径,所以它抛出了 IllegalArgumentException.

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