数据库更改时,CursorLoader不会刷新

时间:2013-12-27 20:54:50

标签: android android-contentresolver android-cursorloader android-loader

我有一个非常简单CursorLoader加载Cursor。我将光标存储为活动中的字段。 (所以不在CursorAdapter!)

    public static class BundlesLoader extends CursorLoader {
        public static final String[] PROJECTION = new String[]{
                BaseColumns._ID,
                TITLE,
                SUBTITLE,
                DESCRIPTION
        };

        public BundlesLoader(Context ctx) {
            super(
                    ctx,
                    URI_BUNDLES,
                    PROJECTION,
                    null,
                    null,
                    POSITION + " ASC"
            );
        }
    }

当我调用ContentResolver.notifyChange(URI_BUNDLES, null)时,我希望CursorLoader重新加载,但事实并非如此。 (参见下面的LoaderCallbacks;我记录回调。)

要调试此问题,我注册了一点ContentObserver,其中 工作,奇怪的是:

      getContentResolver().registerContentObserver(LegislationProvider.URI_BUNDLES,
            false, new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange) {
            Log.e("hello", "bundles changed!!!!!");
        }

        @Override
        public void onChange(boolean selfChange, Uri uri) {
            onChange(selfChange);
        }
    });

所以知道我不知道如何从这里调试。我的CursorLoader初始化正常,我的ContentObserver正常工作,但由于某种原因,当基础数据库发生更改时,CursorLoader不会重新加载Cursor。什么可能是错的?


以下是我的LoaderCallbacks

    @Override
    public android.support.v4.content.Loader onCreateLoader(int id, Bundle bundle) {
        switch (id) {
            case LoaderIds.LOADER_BUNDLES:
                d("Creating new bundles loader");
                return new Model.Bundle.Loader(getApplicationContext());
            default:
                throw new IllegalArgumentException(
                        "Could not handle loader id " + id);
        }
    }

    @Override
    public void onLoadFinished(android.support.v4.content.Loader loader, Cursor cursor) {
        switch (loader.getId()) {
            case LoaderIds.LOADER_BUNDLES:
                d("onLoadFinished: Bundles loaded with "
                        + cursor.getCount() + " elements");
                mMasterFragment.setBundlesCursor(cursor);
                break;
            default:
                throw new IllegalArgumentException(
                        "Could not handle loader id " + loader.getId());
        }
    }

    @Override
    public void onLoaderReset(android.support.v4.content.Loader loader) {
        switch (loader.getId()) {
            case LoaderIds.LOADER_BUNDLES:
                d("onLoaderReset: Clearing collection adapter");
                mMasterFragment.setBundlesCursor(null);
                break;
            default:
                throw new IllegalArgumentException(
                        "Could not handle loader id " + loader.getId());
        }
    }

1 个答案:

答案 0 :(得分:1)

即使您使用setNotificationUri(getContentResolver(), URI_BUNDLES),仍需要在光标上调用CursorLoader。如果你这样做,我不知道你的问题。