3

私はデータを取得するIOSchedCursorLoaderの方法に従うアプリを構築していますが、次の代わりに使用すると思っていたという事実がありますContentObserver

私はまた、使用するRetoのandroid-protips-locationを参照してCursorLoaderおり、ロジックフローはIOSchedと非常に似ているため、次のようになります。

initLoader → startService (serviceIntent) → handleIntent → insert into DB → notifyChange → onLoadFinished → update UI

私が期待しているのは、データベースで実行された後のCursorLoader戻り値です。Cursorinsert

現在、フラグメントはこれに対してクエリをonActivityCreated呼び出して実行し、現在のデータとともにその時点のを返します。ただし、更新を実行してもトリガーされていないようです。ログは、が実行されたことを示していますが、ログを表示すると、挿入時にディスパッチされたことが示されます。initLoaderContentProviderCursoronLoadFinisheddeleteinsertContentProvidernotifyChange

// in my Fragment:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    getLoaderManager().initLoader(0, null, this);
    refreshWelcome();
}

public void refreshWelcome() {
    Intent i = new Intent(getActivity(), SyncService.class);
    i.setAction(SyncService.GET_WELCOME);
    getActivity().startService(i);
}

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    Uri queryUri = AppContract.Welcome.CONTENT_URI;
    String[] projection = new String[] { Welcome.WELCOME_FIRST_NAME };
    String where = null;
    String[] whereArgs = null;
    String sortOrder = null;
    // create new cursor loader
    CursorLoader loader = new CursorLoader(getActivity(), queryUri, projection, where, whereArgs, sortOrder);
    return loader;
}


//in AppProvider (which extends ContentProvider)

@Override
public Uri insert(Uri uri, ContentValues values) {
    final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
    final int match = sUriMatcher.match(uri);
    switch (match) {
    case WELCOME: {
          long rowId = db.insertOrThrow(Tables.WELCOME, null, values);
          if (rowId > 0) {
             getContext().getContentResolver().notifyChange(uri, null);
             return uri;
          }
       }
    }
   return null;
}
4

1 に答える 1