3

我建立遵循检索数据的IOSched方式的应用,与事实不同的是,我想我会用CursorLoader而不是ContentObserverIntentService和CursorLoader Sychronisation问题

我也被提及雷托的android-protips-location这确实使用CursorLoader和逻辑流程颇为相似IOSched,即:

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

我所希望看到发生在CursorLoader返回Cursor一旦在数据库上执行了insert

目前,片段onActivityCreated调用initLoader并在ContentProvider上运行查询,此时用当前数据返回该时间点的Cursor。 但是,当我执行刷新时,似乎onLoadFinished未被触发。日志显示在ContentProvider上执行deleteinsert,但查看日志显示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; 
} 
+1

是否有在IntentService中使用CursorLoader的原因? IntentService是一个在独立线程中执行工作的队列。为什么不直接执行查询? – jsmith

回答

0

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

我这样做,在收到它之后,为光标设置通知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; 
    } 
<}