我不知道爲什麼我總是在onLoadFinished中得到錯誤的uri - 無論我在插入中使用什麼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;
}
這是我在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;
}
quering聲明無論什麼URI我在插入到數據庫時使用,如:
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;
}
}
通知我雖然當我使用URI喜歡content://com.example.products.db/products/milky
我可能會從content://com.example.products.db/products/milky
或content://com.example.products.db/products/milky/stinky
,因爲它上升爲祖先結果。對?我究竟做錯了什麼?從內容提供商(new CursorLoader()
部分),返回Cursor
@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()
然後onLoadFinished()
被稱爲:
什麼是你自定義的'ContentProvider#insert'方法實現? – pskink
@pskink更新了 – deadfish
和你傳遞給'c.setNotificationUri()'方法的uri?它是'content:// com.example.products.db/products/milky',對吧? – pskink