私はデータを取得するIOSchedCursorLoader
の方法に従うアプリを構築していますが、次の代わりに使用すると思っていたという事実がありますContentObserver
。
私はまた、使用するRetoのandroid-protips-locationを参照してCursorLoader
おり、ロジックフローはIOSchedと非常に似ているため、次のようになります。
initLoader → startService (serviceIntent) → handleIntent → insert into DB → notifyChange → onLoadFinished → update UI
私が期待しているのは、データベースで実行された後のCursorLoader
戻り値です。Cursor
insert
現在、フラグメントはこれに対してクエリをonActivityCreated
呼び出して実行し、現在のデータとともにその時点のを返します。ただし、更新を実行してもトリガーされていないようです。ログは、が実行されたことを示していますが、ログを表示すると、挿入時にディスパッチされたことが示されます。initLoader
ContentProvider
Cursor
onLoadFinished
delete
insert
ContentProvider
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;
}