CursorLoader 不刷新数据更改
CursorLoader not refreshing on data change
android 的 CursorLoader 有点问题。我正在使用 CursorLoader 从我自己的 ContentProvider 加载数据。它可以很好地加载数据并保持方向变化,但不会根据数据变化进行更新。顺便说一句,我使用的是兼容库中的 CursorLoader。
我想我已经完成了文档和几个教程告诉我要做的所有事情,但仍然无法正常工作。我检查了该网站上的几个帖子,但似乎没有解决问题。
这是我创建加载程序的地方:
@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);
}
这是我在 ContentProvider 的 delete 方法上调用的方法:
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,在我的查询上调用 setNotificationUri() 并在删除方法上调用 notifyChange() 以传递相同的 Uri,但 onLoadFinished() 不会在数据更改时触发。而且我不会在任何地方关闭光标。
作为解决方法,我手动重新启动加载程序,但这超出了将 CursorLoader 与 LoaderManager 一起使用的目的。
我没有使用 CursorAdapter,我将我在 onLoadFinished() 中获得的数据放在一个 Evidence 对象中,然后将该对象插入到一个列表中,该列表是绑定到一个自定义适配器的数据源网格视图。我这样做是因为我需要将其他数据添加到游标中不存在的证据对象。
Cursor result = database.rawQuery(evidenceQuery, null);
result.setNotificationUri(getContext().getContentResolver(), TODO_EVIDENCES_CONTENT_URI);
return database.rawQuery(evidenceQuery, null);
您没有返回调用 setNotificationUri 的 Cursor。您正在返回第二个 rawQuery 游标。你想要的是:
Cursor result = database.rawQuery(evidenceQuery, null);
result.setNotificationUri(getContext().getContentResolver(), TODO_EVIDENCES_CONTENT_URI);
return result;
android 的 CursorLoader 有点问题。我正在使用 CursorLoader 从我自己的 ContentProvider 加载数据。它可以很好地加载数据并保持方向变化,但不会根据数据变化进行更新。顺便说一句,我使用的是兼容库中的 CursorLoader。
我想我已经完成了文档和几个教程告诉我要做的所有事情,但仍然无法正常工作。我检查了该网站上的几个帖子,但似乎没有解决问题。
这是我创建加载程序的地方:
@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);
}
这是我在 ContentProvider 的 delete 方法上调用的方法:
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,在我的查询上调用 setNotificationUri() 并在删除方法上调用 notifyChange() 以传递相同的 Uri,但 onLoadFinished() 不会在数据更改时触发。而且我不会在任何地方关闭光标。
作为解决方法,我手动重新启动加载程序,但这超出了将 CursorLoader 与 LoaderManager 一起使用的目的。
我没有使用 CursorAdapter,我将我在 onLoadFinished() 中获得的数据放在一个 Evidence 对象中,然后将该对象插入到一个列表中,该列表是绑定到一个自定义适配器的数据源网格视图。我这样做是因为我需要将其他数据添加到游标中不存在的证据对象。
Cursor result = database.rawQuery(evidenceQuery, null);
result.setNotificationUri(getContext().getContentResolver(), TODO_EVIDENCES_CONTENT_URI);
return database.rawQuery(evidenceQuery, null);
您没有返回调用 setNotificationUri 的 Cursor。您正在返回第二个 rawQuery 游标。你想要的是:
Cursor result = database.rawQuery(evidenceQuery, null);
result.setNotificationUri(getContext().getContentResolver(), TODO_EVIDENCES_CONTENT_URI);
return result;