3

我正在构建一个遵循IOSched检索数据方式的应用程序,除了我认为我会使用CursorLoader而不是ContentObserver

我也一直在参考 Reto 的android-protips-location它确实使用CursorLoader并且逻辑流程与 IOSched 非常相似,因此:

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

我期望看到的是在数据库上执行一次后CursorLoader返回 a 。Cursorinsert

目前,片段onActivityCreated调用initLoader并运行查询ContentProviderthis 返回该Cursor时间点的当前数据。但是,当我执行刷新时似乎onLoadFinished没有被触发。日志显示deleteinsertContentProvider执行时执行,但查看日志显示notifyChange在插入时调度。

// 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

0

据我所知,您在 onLoadFinished 中收到光标;onCreateLoader 返回一个 Loader<Cursor>。

我这样做是在收到光标后立即为光标设置通知 Uri。这对我来说可以。

@Override
public void onLoadFinished(Loader<Cursor>loader, Cursor data) {
    Log.v(DEBUG_TAG, "onLoadFinished");
    data.setNotificationUri(getActivity().getContentResolver(),yourURI);
    ((SimpleCursorAdapter) getListAdapter()).swapCursor(data);
    if (data.getCount() == 0) {
        Toast.makeText(getActivity(), "no elements",Toast.LENGTH_SHORT).show();
    return;
    }
<}
于 2013-07-29T21:06:53.477 回答