データベースを照会するListFragment
(ViewPager
内)にCursorLoader
があります。私はそのデータベースのコンテンツプロバイダを持っています。私はそれを検証しました。CursorLoaderにDBエンティティが表示されない
問題はこれです:アプリは別のサービスは、バルクContentProvider
でを挿入呼び出し、非常に初めて実行するとき:
public int bulkInsert(Uri uri, ContentValues[] values) {
if(LOGV) Log.v(TAG, "insert(uri=" + uri + ", values" + values.toString() + ")");
final SQLiteDatabase db = openHelper.getWritableDatabase();
final int match = uriMatcher.match(uri);
switch(match) {
case SNAP: {
db.beginTransaction();
for(ContentValues cv : values) {
db.insertOrThrow(Tables.SNAP, null, cv);
}
db.setTransactionSuccessful();
db.endTransaction();
getContext().getApplicationContext().getContentResolver().notifyChange(uri, null);
return values.length;
}
CursorLoader
0行にかかわらず、非常に最初に実行されます(データベースが作成されるとき)。私がアプリケーションを閉じて再起動すると、CursorLoader
はうまく動作し、私が必要とするものを正確に返します。私はハンドラを介して待機を実装しようとしましたが、それは役に立たないようです。ここでCursorLoader
を利用ListFragment
です:
public class DataBySnapFragment extends ListFragment implements LoaderCallbacks<Cursor> {
public static final String TAG = "DataBySnapFragment";
protected Cursor cursor = null;
private DataBySnapAdapter adapter;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.d(TAG, "RELOADING!!!!!");
onLoadDelay();
}
};
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated");
adapter = new DataBySnapAdapter(getActivity(),
R.layout.list_item_databysnap,
null,
new String[]{},
new int[]{},
0);
setListAdapter(adapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_databysnap, null);
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("error_workaround_1",
"workaroundforerror:Issue 19917,
http://code.google.com/p/android/issues/detail?id=19917");
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader cursorLoader = new CursorLoader(getActivity(),
Snap.CONTENT_URI,
null,
null,
null,
Snap.DATA_MONTH_TO_DATE + " DESC LIMIT 6");
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
Log.d(TAG, "data rows: " + data.getCount());
if(data.getCount() <= 0) {
delayThread();
} else {
adapter.swapCursor(data);
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
private void onLoadDelay() {
getLoaderManager().initLoader(0, null, this);
}
private void delayThread() {
new Thread() {
public void run() {
longTimeMethod();
handler.sendEmptyMessage(0);
}
}.start();
}
private void longTimeMethod() {
try {
Thread.sleep(12000);
} catch (InterruptedException e) {
Log.e("tag", e.getMessage());
}
}
}
誰もがこれが起こって、または少なくとも正しい方向に私を操縦する理由を私に知らせてくださいことはできますか?ありがとう!
を私は実装のContentProviderはさわやかのすべてを扱っ思いましたか? ContentProviderに最初に書き込むサービスにバインドすることで動作させることができました。サービスがその完了を通知すると、getLoaderManager()を呼び出すと、initLoader(0、null、this);それはうまく動作します。 コンテンツの一部またはSQLiteOpenHelperが正しく実装されていないため、それが必要なときにリフレッシュされない原因になっているかどうか不思議です。 – Chris