MergeCursor не обновляется после изменения данных

Я создаю MergeCursor примерно так:

    @Override
    public Cursor loadInBackground() {
        Log.d(LOG, "loading data in background");

        ContentResolver cr = getContext().getContentResolver();
        Cursor people = getContext().getContentResolver().query(PeopleProvider.CONTENT_URI, null, null, null, null);
        people.setNotificationUri(cr, PeopleProvider.CONTENT_URI);
        Cursor jobs = getContext().getContentResolver().query(JobProvider.CONTENT_URI, null, null, null, null);
        jobs.setNotificationUri(cr, JobsProvider.CONTENT_URI);
        Cursor horses = getContext().getContentResolver().query(HorseProvider.CONTENT_URI, null, null, null, null);
        horses.setNotificationUri(cr, HorseProvider.CONTENT_URI);

        Cursor[] c = new Cursor[3];

        c[0] = people;
        c[1] = jobs;
        c[2] = horses;

        MergeCursor mc = new MergeCursor(c);

        return mc;
    }

Затем, когда я добавляю новые строки в соответствующие таблицы БД:

    "PeopleProvider.java"

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.d(LOG, "Insert into People");
        long id = database.insertOrThrow(DatabaseConstants.TABLE_PEOPLE, null, values);
        getContext().getContentResolver().notifyChange(uri, null);
        return ContentUris.withAppendedId(uri, id);
    }

Я также попробовал:

    "WhereDataIsPresentedFragment.java"
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(LOG, "onActivityResult()");
        switch(requestCode) {
        case NEW_PEOPLE_ACTIVITY:
            Log.d(LOG, "Returned with newly added person");
            if (resultCode==Activity.RESULT_OK) {
                mListViewAdapter.notifyDataSetChanged();
                getActivity().getContentResolver().notifyChange(PeopleProvider.CONTENT_URI, null);
            }
            break;
        }
    }

Все методы вызываются (подтверждается через Log.d), поэтому я не уверен, почему курсоры не обновляются при срабатывании уведомлений. Любая идея сделать эту работу будет принята с благодарностью. В прошлом у меня не было проблем с обычными курсорами, но мне не повезло с этим бизнесом MergeCursor.

1 ответ

Решение

Таким образом, способ, которым я получил эту работу (правильно это или нет), заключается в дальнейшем наследовании моего класса AsyncTaskLoader:

    @Override
    protected void onStartLoading() {

        forceLoad();
    }

По сути, добавив forceLoad(); к onStartLoading() Метод все теперь работает как положено. Мне удалось удалить все дополнительные звонки notifyDataSetChanged() и уведомления на URI. Эта единственная линия исправила все. Если у кого-то есть лучшее решение, пожалуйста, дайте мне знать, но сейчас это то, что я получил.

Другие вопросы по тегам