2016-10-25 2 views
1

Я довольно новичок в разработке Android, и сейчас я создаю приложение для заметок с текстовой записью и функцией контрольного списка. Однако есть ошибка, с которой я в настоящее время запутался. Это происходит, когда пользователь пытается добавить новый элемент в контрольный список, и приложение просто направляет метод на нежелательный.Неправильный контекст в 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 вместо в контрольном спискеContentProvider

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) 

ответ

0

Непосредственная проблема заключается в том, что у вас есть NoteContentProvider, зарегистрированный для органа, повторно запрашивать. UriMatcher не соответствует ни одному пути checklist, поэтому его выбрасывает IllegalArgumentException.

Вообще говоря, приложениям нужен только один поставщик, который определяет данные результата из пути и идентификатора в URI. Вы можете легко объединить два класса провайдера, которые у вас есть в настоящее время, и объединить их настройки UriMatcher и методы CRUD. Когда запрос получен, просто определите, какая таблица вам нужна для доступа из URI с помощью сопоставления, и соответственно выполните необходимую операцию с базой данных.

0

Ваш LogCat указывает 'содержание: //cmc.note.data.provider/checklist' неизвестен Uri. Проверьте свой URI_MATCHER, у него нет «cmc.note.data.provider/checklist», или может быть ваш коммутатор неверен (case NOTES)

Смежные вопросы