我对android的CursorLoader有点问题。我正在使用CursorLoader从我自己的ContentProvider加载数据。它可以很好地加载数据并使其保持方向更改,但不会更新数据更改。顺便说一下,我正在使用兼容性库中的CursorLoader。
我想我已经完成了文档和几个教程告诉我要做的所有事情,但它仍然无效。我已经检查过这个网站上的几个帖子,但nothig似乎已经解决了这个问题。
这是我创建Loader的地方:
@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的delete方法上调用notifyChange(),但onLoadFinished()在数据更改时不会被触发。而且我没有把光标关在任何地方。
作为一种解决方法,我正在手动重新启动加载程序,但这比使用CursorLoader和LoaderManager要好。
我没有使用CursorAdapter,我将onLoadFinished()中的数据放入Evidence对象中,然后将此对象插入到列表中,该列表是与GridView绑定的自定义适配器的数据源。我这样做是因为我需要将其他数据添加到游标中不存在的Evidence对象中。
答案 0 :(得分:1)
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;