从onLoadFinished更新数据库一次又一次地调用onLoadFinished

时间:2015-02-20 04:04:03

标签: android cursor android-contentprovider loader android-cursorloader

我遇到的情况是,我需要在某个日期插入一行,并在活动中的特定日期之后更新所有条目。

为此,我想我会在日期之后使用LoaderManager回调加载条目,并使用ContentProviderOperation数组从onLoadFinished()批量更新所有条目方法

我面临的问题是我对游标有setNotificationUri,因此再次调用onLoadfinished,再次插入行并继续循环(不设置通知{{ 1}}不是我的选择。)

有没有优雅的解决方案来阻止递归调用?

以下是我的UrionCreateLoader的简化代码:

onLoadFinished

4 个答案:

答案 0 :(得分:0)

我最终将db操作移动到一个单独的线程而不使用加载器回调

答案 1 :(得分:0)

决定为那些在这个问题上苦苦挣扎的人写一个答案。

我有两个带有外键的表,我需要从1个表中的_ID来在第二个表中创建一个foreing键,这就是为什么我必须单独插入每一行(而不是作为bulkInsert)。它导致我的Loader在每次插入后更新。我已经通过阻止ContentProvider中的insert方法调用notifyChange并在每次批量操作后手动通知ContentProvider来解决了这个问题。

希望这会对某人有所帮助。

答案 2 :(得分:0)

  

是否有任何优雅的解决方案来停止递归调用?

解决方法很简单,关闭光标以停止递归调用。只需添加它-

data.close();

applyBatch的不透明度之后。

答案 3 :(得分:-1)

您是否尝试过如下:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    Log.i(TAG, "Inside onLoadFinished");
    // Swap the new cursor in.  (The framework will take care of closing the
    // old cursor once we return.)
    mAdapter.swapCursor(data);

    // The list should now be shown.
    if (isResumed()) {
        setListShown(true);
    } else {
        setListShownNoAnimation(true);
    }
}