什么可能导致我的CursorLoader错过更新?

时间:2015-02-03 23:48:38

标签: android android-fragments android-contentprovider android-loader

我在片段中有一个装载器,基本上是"计数"数据库中的行,使用由sqlite数据库支持的内容提供程序。我还有一个后台线程在数据库中添加/删除行。该服务从与我的片段所附加的活动相同的活动开始。

我看到的行为如下:

  • 服务成功添加/删除行
  • 内容提供商通过调用getContext().getContentResolver().notifyChange(uri, null);来通知更改(这由日志声明验证)
  • 除非我在加载器上调用强制刷新(getLoaderManager().getLoader(LOADER_ID).forceLoad()
  • ,否则片段看不到更改

以下是我如何在单独的服务中更新内容:

// inserting values...
final ContentValues cv = generateContentValues();
getContentResolver().insert(ItemEntry.CONTENT_URI, cv);

// and elsewhere in the code, deleting values...
getContentResolver().delete(ItemEntry.buildItemUri(id), null, null);

我在这里创建加载器:

public static String[] ITEM_COLUMNS = new String[] { ItemEntry._ID };

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    Log.d(TAG, "onCreateLoader called");

    Toast.makeText(getActivity(), "onCreateLoader", Toast.LENGTH_LONG).show();
    return new CursorLoader(getActivity(),
            ItemEntry.CONTENT_URI,
            ITEM_COLUMNS,
            null,
            null,
            null);
}


@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    Toast.makeText(getActivity(), "found " + data.getCount() + " items", Toast.LENGTH_LONG).show();
    processDataCount(data.getCount());
}

我尝试使用null作为投影创建加载程序,它应返回所有列,但没有区别。基本上,我看到数据更改的唯一方法是在加载器上调用forceLoad()时。

有什么想法吗?我甚至不知道从哪里开始。提前谢谢!

1 个答案:

答案 0 :(得分:0)

ARRGH,它总是很简单!

我在数据提供商的setNotificationUri返回光标时忘了query

    retCursor.setNotificationUri(getContext().getContentResolver(), uri);
    return retCursor;

小心地复制/粘贴,伙计们!