0

Ich weiß nicht, warum ich immer falsch uri in onLoadFinished - egal, welche URI ich verwende in einfügen.CursorLoader wenn notify, immer in onLoadFinished falsch uri

Wenn app beginnt ich in meiner Tätigkeit rufen in onResume: getLoaderManager().restartLoader(LOADER_PRODUCTS, null, this);

und 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; 
} 

Dies ist meine Erklärung für Quering in 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; 
} 

Egal was uri Ich benutze beim Einfügen in Datenbank, wie:

getContentResolver().insert("content://com.example.products.db/products", cv); oder 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); 
} 

meine cursorLoader fängt immer Benachrichtigung mit 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; 
    } 
} 

ich aber, wenn ich uri wie content://com.example.products.db/products/milky ich könnte bekommt Ergebnisse aus content://com.example.products.db/products/milky oder content://com.example.products.db/products/milky/stinky, weil es für Vorfahren nach oben geht. Recht? Was mache ich falsch?

+0

Was ist Ihre benutzerdefinierte 'ContentProvider # insert' Methode Implementierung? – pskink

+0

@pskink aktualisiert – deadfish

+0

und welche URI übergeben Sie 'c.setNotificationUri()' Methode? Es ist 'content: // com.example.products.db/products/milky', oder? – pskink

Antwort

0

Beim Erstellen Loader, Code:

@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; 
} 

Anrufe queue() von Ihrem Content Provider (new CursorLoader() Teil), kehrt Cursor und dann onLoadFinished() genannt wird.

Methode onLoadFinished() erhält eine Cursor von onCreateLoader. Das ist alles.

Da Sie Ihre Uri von "content://com.example.products.db/products/milky"-queue() Methode senden es gibt nur Cursor, die zur Verfügung gestellt zu Uri verweist. Es funktioniert wie beabsichtigt.

Ich denke, dass Sie vielleicht etwas anderes hier suchen. Lader sind da, um die Daten vom Inhaltsanbieter zu laden. Vielleicht haben Sie versehentlich gedacht, dass onLoadFinished() seine Daten von insert() Anrufe bekommt?

Hoffe das klärt es auf.