0

我不知道爲什麼我總是在onLoadFinished中得到錯誤的uri - 無論我在插入中使用什麼uri。CursorLoader通知時,總是進入onLoadFinished錯誤uri

當應用程序開始我在我的活動調用onResumegetLoaderManager().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/milkycontent://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()被稱爲:

+0

什麼是你自定義的'ContentProvider#insert'方法實現? – pskink

+0

@pskink更新了 – deadfish

+0

和你傳遞給'c.setNotificationUri()'方法的uri?它是'content:// com.example.products.db/products/milky',對吧? – pskink

回答

0

當創建裝載機,代碼。

方法onLoadFinished()onCreateLoader得到Cursor。就這些。

因爲您發送您的"content://com.example.products.db/products/milky"Uriqueue()方法只是返回Cursor指向提供Uri。它按預期工作。

我在想,也許你正在尋找別的東西在這裏。裝載機在那裏加載來自內容提供者的數據。也許你錯誤地認爲onLoadFinished()insert()調用中獲取其數據?

希望這會清除它。