2

データベースを照会するListFragmentViewPager内)に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()); 
     } 
    } 
} 

誰もがこれが起こって、または少なくとも正しい方向に私を操縦する理由を私に知らせてくださいことはできますか?ありがとう!

答えて

0

メインスレッドを停止していない限り、新しいスレッドを作成してスリープ状態にすると、実際には何も解決されません。

正確には何が間違っているかはっきり言えませんが、データを最新表示する必要があるようです。テストするには、データコンテンツを更新するOnClickListenerを使用してボタンを作成し、データベースから再度プルしようとする可能性があります。

+0

を私は実装のContentProviderはさわやかのすべてを扱っ思いましたか? ContentProviderに最初に書き込むサービスにバインドすることで動作させることができました。サービスがその完了を通知すると、getLoaderManager()を呼び出すと、initLoader(0、null、this);それはうまく動作します。 コンテンツの一部またはSQLiteOpenHelperが正しく実装されていないため、それが必要なときにリフレッシュされない原因になっているかどうか不思議です。 – Chris

0

一括挿入が完了すると、LoaderManager.LoaderCallbacksインターフェイスを実装しているフラグメント/アクティビティにメッセージを送信する必要があります。 アクティビティ/フラグメントがメッセージを受け取ると、getLoaderManager()。restartLoader(0、null、this)を呼び出してDBを再クエリする必要があります。

これは、サンプルアプリんあまりにhttp://developer.android.com/guide/topics/fundamentals/loaders.html

0

がonLoadFinishedこのよう変更しようものです:

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    Log.d(TAG, "data rows: " + data.getCount()); 
    if(data.getCount() <= 0) { 
     delayThread(); 
    } else { 
     // set the notification for the cursor 
     data.setNotificationUri(getActivity().getContentResolver(), Snap.CONTENT_URI); 
     adapter.swapCursor(data);   
    } 
} 
関連する問題