【发布时间】:2016-01-28 14:18:14
【问题描述】:
我在使用 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() 并在传递相同 Uri 的删除方法上调用 notifyChange(),但 onLoadFinished() 不会在数据更改时触发。而且我不会在任何地方关闭光标。
作为一种解决方法,我手动重新启动加载程序,但这超出了将 CursorLoader 与 LoaderManager 一起使用的目的。
我没有使用 CursorAdapter,我将我在 onLoadFinished() 中获得的数据放入 Evidence 对象中,然后将此对象插入到列表中,该列表是绑定到 GridView 的自定义适配器的数据源。我这样做是因为我需要将其他数据添加到光标中不存在的 Evidence 对象。
【问题讨论】:
-
你要关闭光标吗?
-
不,我没有关闭光标。我将把它添加到问题中。
标签: android android-contentprovider android-cursorloader android-loadermanager