0

なぜ私はonLoadFinishedで間違ったURIを取得するのか分かりません。通知時のCursorLoaderは、常にonLoadFinishedになります。間違ったuri

アプリが起動し、私はonResumeの私の活動に呼び出す:getLoaderManager().restartLoader(LOADER_PRODUCTS, null, this);

、それはINITS:

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    switch (id) { 
     case LOADER_PRODUCTS: 
      return new CursorLoader(ProductListActivity.this, "content://com.example.products.db/products/milky", null, null, null, null); 
    } 
    return null; 
} 

これは、何があったURI contentProvider

@Override 
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
    SQLiteDatabase db = sqliteOpenHelper.getReadableDatabase(); 
    SQLiteQueryBuilder sqb = new SQLiteQueryBuilder(); 
    String where = null; 
    Cursor c = null; 

    switch (uriMatcher.match(uri)) { 
     case PRODUCTS: 
      sqb.setTables(TProduct.NAME); 
      break; 
     case PRODUCTS_MILKY: 
      sqb.setTables(TProduct.NAME); 
      break; 
     case PRODUCTS_MILKY_STINKY: 
      sqb.setTables(TProduct.NAME); 
      break; 
    } 

    c = sqb.query(db, projection, where, selectionArgs, null, null, sortOrder); 
    c.setNotificationUri(getContext().getContentResolver(), uri); 

    return c; 
} 

にキシにしないための私の宣言です私はデータベースに挿入中に次のように使用します:

getContentResolver().insert("content://com.example.products.db/products", cv);またはgetContentResolver().insert("content://com.example.products.db/products/milky/stinky", cv);

@Override 
public Uri insert(Uri uri, ContentValues values) { 
    String table = ""; 
    switch (uriMatcher.match(uri)) { 
     case PRODUCTS: 
      table = TProduct.NAME; 
      break; 
     case PRODUCTS_MILKY: 
      table = TProduct.NAME; 
      break; 
     case PRODUCTS_STINKY: 
      table = TProduct.NAME; 
      break; 
    } 

    long rowId = sqliteOpenHelper.getWritableDatabase().insert(table, null, values); 
    if (rowId != -1) { 
     Uri retUri = ContentUris.withAppendedId(uri, rowId); 
     getContext().getContentResolver().notifyChange(retUri, null); 
     return retUri; 
    } 
    Log.d("INSERT FAILED", values.toString()); 
    throw new SQLException("Failed to insert row. " + values); 
} 

cursorLoaderは常にURI content://com.example.products.db/products/milky

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    switch (loader.getId()) { 
     case LOADER_PRODUCTS: 
      ((CursorAdapter) mListView.getAdapter()).swapCursor(data); 
      break; 
    } 
} 

との通知をキャッチし、私はcontent://com.example.products.db/products/milkyのようなURIを使用する場合、それは先祖のために上がるので、私はしかし、私はcontent://com.example.products.db/products/milkyまたはcontent://com.example.products.db/products/milky/stinkyから結果を取得することがあります。右?私は間違って何をしていますか? Cursorその後、onLoadFinished()が呼び出される返すあなたのコンテンツプロバイダ(new CursorLoader()部分)から

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    switch (id) { 
     case LOADER_PRODUCTS: 
      return new CursorLoader(ProductListActivity.this, "content://com.example.products.db/products/milky", null, null, null, null); 
    } 
    return null; 
} 

通話queue()、:

+0

あなたのカスタム 'ContentProvider#insert'メソッドの実装は何ですか? – pskink

+0

@pskinkは – deadfish

+0

を更新しました。あなたは 'c.setNotificationUri()'メソッドにどのURIを渡していますか?それは 'content:// com.example.products.db/products/milky'ですよね? – pskink

答えて

0

ローダーを作成し、コード。

onLoadFinished()CursoronCreateLoaderから取得します。それだけです。

あなたはそれだけで提供Uriを指すCursorを返すqueue()方法に"content://com.example.products.db/products/milky"のごUriを送信しているので。意図したとおりに動作します。

ここで何か他のことをしたいと思っていると思います。ローダは、コンテンツプロバイダからのデータをロードするためにそこにあります。多分onLoadFinished()insert()からデータを取得すると間違って考えていたのでしょうか?

これはこれをクリアします。

関連する問題