2

Googleカレンダーからすべてのユーザーのカレンダーイベントを取得してプルするアクティビティがあります。データベースに正常に挿入されますが、Loader for theアクティビティのListFragment`は、変更があったときにリストを更新するためのコールバックを取得しません。アクティビティから戻って、ローダーがすべてを正しくロードするために戻ってくる必要があります。

以前にローダーを実行したことがあり、この問題は一度もありませんでした。基本的に、正しく動作する別のプロジェクトからローダーをコピーしたので、コンテンツが変更されたときにコールバックを取得できない理由がわかりませんか?

これはデータベースへの私の挿入方法です

@Override
public Uri insert(Uri uri, ContentValues values) {
    long rowID = db.insert(EVENTS_TABLE,null, values);
    Uri _uri = null;
    if(rowID > 0){
        _uri = ContentUris.withAppendedId(CONTENT_ID_URI_BASE,rowID);
        getContext().getContentResolver().notifyChange(_uri,null);

    }else{
        throw new SQLException("Failed to insert row into " + uri);
    }
    return _uri;
}

ご覧notifyChangeのとおり、アダプターが更新されるように呼び出していますが、更新されません。

これは私のListFragment

@Override
public void onActivityCreated(Bundle state){
    super.onActivityCreated(state);

    lv = getListView();
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    View v = getView();
    v.setClickable(true);
    setEmptyText("No Events");
    populate();
}

public void populate(){
    mAdapter = new CalendarRowAdapter(getActivity(), R.layout.calendar_view, null,
            new String[] {CalendarProvider.EVENT,CalendarProvider.LOCATION,CalendarProvider.DESCRIPTION,CalendarProvider.START},
            new int[] {R.id.calendarEntryText,R.id.locationEntryText,R.id.descEntryText,R.id.dateEntryText},0);

    setListAdapter(mAdapter);

    getLoaderManager().initLoader(0,null,this);
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return new CursorLoader(getActivity(),
            CalendarProvider.CONTENT_URI,new String[] {CalendarProvider.ID,CalendarProvider.EVENT,
        CalendarProvider.LOCATION,CalendarProvider.DESCRIPTION,CalendarProvider.START}
    ,null,null,CalendarProvider.START + " COLLATE LOCALIZED ASC");
}

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
    mAdapter.swapCursor(arg1);
    if(isResumed()){
        setListShown(true);
    }else{
        setListShownNoAnimation(true);
    }
}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
    mAdapter.swapCursor(null);

} 

私が言ったように、すべてがデータベースに正しく入っていますが、ローダーがリストを更新するためのコールバックを取得していません。

カレンダーイベントはからデータベースに入れられますが、AsyncTaskそれが問題だとは思いません

logcat にもエラーは表示されません

編集

私のクエリ方法

@Override
public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {
    SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
    sqlBuilder.setTables(EVENTS_TABLE);

    if(uriMatcher.match(uri) == 1){
        sqlBuilder.setProjectionMap(mMap);
    }else if(uriMatcher.match(uri) == 2){
        sqlBuilder.setProjectionMap(mMap);
        sqlBuilder.appendWhere(ID + "=?");
        selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,new String[] {uri.getLastPathSegment()});
    }
    if(sortOrder == null || sortOrder == "")
        sortOrder = START + " COLLATE LOCALIZED ASC";
    Cursor c = sqlBuilder.query(db, projection, selection, selectionArgs,null,null, sortOrder);
    c.setNotificationUri(getContext().getContentResolver(), uri);
    return c;
}
4

1 に答える 1

4

挿入メソッドでは、挿入notifyChangeされた特定の行の URI を使用して呼び出しますが、クエリ側では、URI はデータ セット全体を表す別の URI です。notifyChangeon/foo/bar/1をリッスンしているリスナーに通知しません/foo/bar。したがって、メソッドでは、特定の行ではなく、データセットの URI を使用しinsert()て呼び出す必要があります。notifyChange

于 2013-01-16T22:52:08.430 に答える