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. Эта единственная линия исправила все. Если у кого-то есть лучшее решение, пожалуйста, дайте мне знать, но сейчас это то, что я получил.