CursorLoader没有刷新数据更改

问题描述 投票:0回答:1

我对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对象中。

android android-contentprovider android-cursorloader android-loadermanager
1个回答
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;
© www.soinside.com 2019 - 2024. All rights reserved.