4

インターフェイス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が作成されたときに呼び出すと呼び出されます。

私の問題はContentProvider、次のquery()メソッドを持つ my にあります。

@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ウェブサーバーから応答を受け取った後、データベースで更新されます。ただし、の update メソッドでメソッドを呼び出すと、 のインスタンス化時に使用したものと uri が同じであっても、 のgetContext().getContentResolver().notifyChange(uri, null)メソッドは呼び出されません。ContentProviderOnLoadFinished()ActivityCursorLoader

これは、次の更新方法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;
}

同じURIOnLoadFinshed()を呼び出したときにメソッドが呼び出されない原因を誰か教えてもらえますか?notifyChange()

ありがとう、クリスティ

4

1 に答える 1

10

Cursorプロバイダーのquery()メソッドであなたを返す前に、次のメソッドを呼び出す必要があります

cursor.setNotificationUri(contentResolver, uri); 

ContentResolver経由で取得できますContext。これにContentProviderは方法getContext()があります。

于 2012-06-07T21:23:47.640 に答える