我在尝试删除具有特定 ID 的一行数据时遇到问题,而不是通过内容提供程序删除我数据库中的所有数据。
这里是删除内容提供者的方法:
@Override
public int delete(@NonNull Uri uri, @Nullable String selection,
@Nullable String[] selectionArgs) {
switch(sUriMatcher.match(uri))
{
case CARD:
selection = (selection == null) ? "1" : selection;
break;
case CARD_WITH_ID:
long id = ContentUris.parseId(uri);
selection = String.format("%s = ?", Contract.Columns._ID);
selectionArgs = new String[]{String.valueOf(id)};
break;
default:
throw new IllegalArgumentException("Illegal delete URI");
}
SQLiteDatabase db = mCardSQLite.getWritableDatabase();
int count = db.delete(Contract.TABLE_NAME, selection, selectionArgs);
if(count > 0)
{
//Notify observers of the change
getContext().getContentResolver().notifyChange(uri, null);
}
return count;
}
我试图让 switch 语句的 CARD_WITH_ID
部分运行。我不明白为什么不是。
这是我要测试的查询
getContentResolver().delete(CardProvider.Contract.CONTENT_URI,CardProvider.Contract.Columns._ID ,null);
如何只选择一列而不是像我在上面的代码中所做的那样选择所有列?
最佳答案
是的,您提供给 .delete()
的 URI 不正确。这意味着您提供的 sUriMatcher.match(uri)
中的 uri
的内容是 CardProvider.Contract.CONTENT_URI
。该 URI 不是特定 ID 的 URI,当然会匹配 CARD
部分
要使 .delete()
进入 CARD_WITH_ID
,您需要这样做:
long id = 1; //id of row that you want to delete
Uri deleteUri = ContentUris.withAppendedId(CardProvider.Contract.CONTENT_URI, id);
//notice code below, not necessary to provide where and selectionArgs as CARD_WITH_ID section wil override it
getContentResolver().delete(uri, null, null);
并确保在 sUriMatcher
static {
...
sUriMatcher.addURI(YOUR_CONTENT_AUTHORITY, YOUR_PATH + "/#", CARD_WITH_ID);
关于java - ContentResolver 删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49344158/