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?
Was ist Ihre benutzerdefinierte 'ContentProvider # insert' Methode Implementierung? – pskink
@pskink aktualisiert – deadfish
und welche URI übergeben Sie 'c.setNotificationUri()' Methode? Es ist 'content: // com.example.products.db/products/milky', oder? – pskink