更新onLoadFinished中的列,导致我的查询无限运行

时间:2013-05-30 13:38:47

标签: android loader

目前我的查询找到了表格中的第一行。使用OnCreateLoader方法中的Loader调用此查询。

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    // TODO Auto-generated method stub

    int age = args.getInt("age");
    int yearDay = args.getInt("year");

    String sort = "(CASE WHEN DateSeen IS NULL "
            + "THEN 1 ELSE 0 END) DESC," + "DateSeen DESC," + "Abs((" + age
            + "  * 365) - (Age * 365) + (" + yearDay
            + " - (Case When YearDay is null then " + yearDay
            + "- 50 ELSE Yearday END)))";

    String[] projection = new String[] { DatabaseProvider.KEY_DESCRIPTION,
            DatabaseProvider.KEY_INT_AGE, DatabaseProvider.KEY_INT_YEARDAY,
            DatabaseProvider.KEY_ID };

    return new CursorLoader(this, DatabaseProvider.CONTENT_URI, projection,
            null, null, sort);

}

在onLoadFinished方法中,我在屏幕上渲染结果,但我也更新了行中的DateSeen列(如果我刷新,则此行不再出现)。

    @Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor c) {

    // lots of code to display results in UI

    // update SeenDate
    c.moveToFirst();

    String Id = c.getString(c.getColumnIndex(DatabaseProvider.KEY_ID));
    ContentResolverCaller.UpdateDateSeen(Id);
}

我的问题(至少我推测)是当结果的DateSeen列更新时,因为Loader有一个内容观察器,如果数据发生变化则自动更新,这导致查询重新运行它会进入一个无限循环。

我的问题是是否可以关闭加载程序的自动更新功能?如何在不触发Loader再次运行查询的情况下更新DateSeen列?

编辑:我忘了包含UpdateDateSeen方法以防万一出现问题。它在下面(我有一个类,我存储所有的ContentResolver调用,不确定它是否是最好的解决方案 - 只是出于整洁)

    public static int UpdateDateSeen(String Id) {
    ContentValues cv = new ContentValues();
    cv.put(DatabaseProvider.KEY_DATESEEN, new Date().getTime());

    return context.getContentResolver().update(
            Uri.withAppendedPath(DatabaseProvider.CONTENT_URI, Id), cv,
            null, null);
}

1 个答案:

答案 0 :(得分:1)

我假设你在数据库助手类中调用setNotificationUri来监视db中的任何更改。你不应该打电话给

getContentResolver().notifyChange(uri, null);
更新查询中的

。这不会触发内容解析程序再次更新查询。