0

У меня проблема с CursorLoader от android. Я использую CursorLoader для загрузки данных из моего собственного ContentProvider. Он хорошо загружает данные и сохраняет изменения ориентации, но при изменении данных он не обновляется. Кстати, я использую CursorLoader, который входит в библиотеку совместимости.CursorLoader не обновляется при изменении данных

Я думаю, что я сделал все, что мне рассказали документация и несколько уроков, но она по-прежнему не работает. Я проверил несколько сообщений на этом сайте, но nothig, похоже, исправил это.

Вот где я создаю погрузчик:

@Override 
public Loader onCreateLoader(int id, Bundle args) { 
    switch (id) {    
     case TODO_EVIDENCES_LOADER_ID: { 
      return new CursorLoader(this, BuilderToDoContentProvider.TODO_EVIDENCES_CONTENT_URI, null, null, new String[]{token_id}, null); 
     } 
    } 
    return null; 
} 

Это метод, который я называю по методу запроса на мой ContentProvider:

private Cursor getToDoEvidences(String selection){ 
    String evidenceQuery = "SELECT " + BuilderToDoContract.Evidence.TABLE_NAME + "." + BuilderToDoContract.Evidence._ID + ", " + 
      BuilderToDoContract.Evidence.TABLE_NAME + "." + BuilderToDoContract.Evidence._PATH + ", " + BuilderToDoContract.Evidence.TABLE_NAME + "." + BuilderToDoContract.Evidence._TIMESTAMP + ", " + 
      BuilderToDoContract.Evidence.TABLE_NAME + "." + BuilderToDoContract.Evidence._TYPE + 
      " FROM " + BuilderToDoContract.Evidence.TABLE_NAME + " WHERE " + selection; 
    Cursor result = database.rawQuery(evidenceQuery, null); 
    result.setNotificationUri(getContext().getContentResolver(), TODO_EVIDENCES_CONTENT_URI); 
    return database.rawQuery(evidenceQuery, null); 
} 

Это метод, который я называю на метод удаления моего контентаОбзор:

private int deleteEvidence(String[] selection) { 
    int result = database.delete(BuilderToDoContract.Evidence.TABLE_NAME, BuilderToDoContract.Evidence._PATH + " = ?" , selection); 
    getContext().getContentResolver().notifyChange(TODO_EVIDENCES_CONTENT_URI, null); 
    return result; 
} 

Как вы можете видеть, я создаю CursorLoader, вызывая s etNotificationUri() в моем запросе и вызове notifyChange() метода удаления, передающего тот же Uri, но onLoadFinished() не запускается при изменении данных. И я нигде не закрываю курсор.

В качестве обходного пути я перезапускаю загрузчик вручную, но это превосходит цель использования CursorLoader с LoaderManager.

Я не использую CursorAdapter, я помещаю данные, которые я получаю в onLoadFinished() внутри объекта Evidence, а затем вставляя этот объект в список, который является источником данных пользовательского адаптера, привязанного к GridView , Я делаю это, потому что мне нужно добавить другие данные к объекту Evidence, которого нет в курсоре.

+0

Вы вообще закрываете курсор? – DeeV

+0

Нет, я не закрываю курсор. Я собираюсь добавить его к вопросу. –

ответ

1
Cursor result = database.rawQuery(evidenceQuery, null); 
result.setNotificationUri(getContext().getContentResolver(), TODO_EVIDENCES_CONTENT_URI); 
return database.rawQuery(evidenceQuery, null); 

Вы не возвращаете курсор, который вы назвали setNotificationUri. Вы возвращаете второй курсор rawQuery. Вы хотите:

Cursor result = database.rawQuery(evidenceQuery, null); 
result.setNotificationUri(getContext().getContentResolver(), TODO_EVIDENCES_CONTENT_URI); 
return result; 
+0

Спасибо, Это сработало, это была очень очевидная ошибка, которую я полностью пропустил. Наверное, мне нужен кофе-брейк. –

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