2014-09-23 6 views
0

Я создаю 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.

+0

Я могу получить курсор и ui для обновления, если я вызову 'getLoaderManager(). RestartLoader (0, null, this);' в методе 'onActivityResult()'. Но мне кажется, что я не должен этого делать. Я довольно уверен, что все правильно настроено - не знаю, почему его не работает :( – Warblr

ответ

0

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

@Override 
    protected void onStartLoading() { 

     forceLoad(); 
    } 

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