なぜ私は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()
、:
あなたのカスタム 'ContentProvider#insert'メソッドの実装は何ですか? – pskink
@pskinkは – deadfish
を更新しました。あなたは 'c.setNotificationUri()'メソッドにどのURIを渡していますか?それは 'content:// com.example.products.db/products/milky'ですよね? – pskink