光标更改时不调用 Android OnLoadFinished()

标签 android android-contentprovider android-cursor android-cursorloader

我创建了一个简单的 Activity它实现了 LoaderManager.LoaderCallbacks<Cursor>界面。 OnCreateLoader()很简单:

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

    Uri queryUri = ContentUris.withAppendedId(SmartPresentationMessage.Person.CONTENT_URI, 1);
    CursorLoader cursorLoader = new CursorLoader(this, queryUri, null, null, null, null);
    return cursorLoader;
}

当我调用 getLoaderManager().initLoader(0, null, this) 时调用此方法当Activity被 build 。

我的问题是在我的 ContentProvider 上,其中有以下 query()方法:

@Override
public Cursor query(Uri uri, String[] projection, String where,
        String[] whereArgs, String sortOrder)
{
    int match = sUriMatcher.match(uri);

    Cursor queryCursor;
    SQLiteDatabase mdb = mOpenHelper.getReadableDatabase();

    switch (match)
    {
        case PERSON:
            long personID = ContentUris.parseId(uri);

            queryCursor = mdb.query(TABLE_NAME, projection,
                        SmartPresentationMessage.Person._ID + " = " + personID,
                        whereArgs, null, null, sortOrder);

            asyncQueryRequest("" + (taskTag ++ ) , QUERY_URI + "/" + "person");

            return queryCursor;
        default:
            throw new IllegalArgumentException("unsupported uri: " + uri);
    }
}

queryCursor在我收到网络服务器的响应后在数据库中更新。 但是,当我调用 getContext().getContentResolver().notifyChange(uri, null) ContentProvider 中的方法的更新方法, 我的OnLoadFinished() Activity 上的方法不被调用,即使 uri 与实例化 CursorLoader 时使用的相同.

这是 ContentProvider 上的更新方法:

@Override
public int update(Uri uri, ContentValues values, String where, String[] whereArgs)
{
    //getContext().getContentResolver().notifyChange(uri, null);


    // insert the initialValues into a new database row
    SQLiteDatabase db = mOpenHelper.getWritableDatabase();
    int affected;
    try
    {
        switch (sUriMatcher.match(uri))
        {
            case PERSON:
                long personID = ContentUris.parseId(uri);;
                affected = db.update(TABLE_NAME, values,
                        SmartPresentationMessage.Person._ID + " = " + personID,
                        whereArgs);
                getContext().getContentResolver().notifyChange(uri, null);

                break;
            default:
                throw new IllegalArgumentException("Unknown URI " + uri);
        }
    }
    finally
    {
        db.close();
    }

    return affected;
}

谁能告诉我我的 OnLoadFinshed() 的原因是什么?调用 notifyChange() 时未调用方法在同一个 uri 上?

谢谢, 克里斯蒂

最佳答案

在您的提供商的query() 方法中返回您的Cursor 之前,您需要调用以下方法

cursor.setNotificationUri(contentResolver, uri); 

您可以通过 Context 获取 ContentResolver。在 ContentProvider 中有一个方法 getContext() 用于此。

关于光标更改时不调用 Android OnLoadFinished(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10767794/

相关文章:

带有两个或多个模块的 Android Studio 自定义项目模板

java - 安卓光标: database being modified as it is being read

android - Android 的 UriMatcher 的问题

android - 如何在我的应用程序中组织 SQLite 数据库

android - 辛奇能否调用 911 等紧急电话号码?

android - ProgressDialog 在一个单独的线程中

android - 如何在Android中删除SIM卡中的联系人

android - 在 Android Studio 2.3.3 中创建一个 ContentProvider

Android Cursor 最大尺寸

sqlite - SQLite:如何将行值增加+1?