Android &引用;getContentResolver().delete();删除每一行而不是仅删除一行
我正在尝试创建自己的ContentProvider,目前正在同一个应用程序中测试它。插入方法工作正常。但是当我试图删除一行时。它最终会删除每一行,而不仅仅是我选择的那一行。我发送的是select on子句和它应该删除的参数,所以我不明白为什么它会删除每一行而不是一行 在KontaktCP中,delete方法似乎认为我发送的不是参数。因为它与MKONTAKT而不是KONTAKT匹配,因此会删除每一行 我目前已经硬编码了这个论点,因为我只是在测试。但我已经检查了在运行程序时,数据库中是否存在值为1的_ID。另外一个ID不是1 主活动中的相关代码:Android &引用;getContentResolver().delete();删除每一行而不是仅删除一行,android,database,android-contentprovider,Android,Database,Android Contentprovider,我正在尝试创建自己的ContentProvider,目前正在同一个应用程序中测试它。插入方法工作正常。但是当我试图删除一行时。它最终会删除每一行,而不仅仅是我选择的那一行。我发送的是select on子句和它应该删除的参数,所以我不明白为什么它会删除每一行而不是一行 在KontaktCP中,delete方法似乎认为我发送的不是参数。因为它与MKONTAKT而不是KONTAKT匹配,因此会删除每一行 我目前已经硬编码了这个论点,因为我只是在测试。但我已经检查了在运行程序时,数据库中是否存在值为1的
public class MainActivity extends Activity
{
public static String PROVIDER="com.example.prosjekt3";
public static final Uri CONTENT_URI = Uri.parse("content://"+ PROVIDER + "/kontakt/");
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Delete values //
String [] arguments = new String[1];
arguments[0] = "1";
String selectionclause = "_ID = ?";
getContentResolver().delete(CONTENT_URI, selectionclause, arguments);
}
// more code under here
}
KontaktCP中的相关代码
public class KontaktCP extends ContentProvider
{
private final static String TABLE_kontakt="Kontakter";
public final static String PROVIDER="com.example.prosjekt3";
public static final String KEY_ID="_ID";
private static final int KONTAKT =1;
private static final int MKONTAKT=2;
DBHandler DBhelper;
static SQLiteDatabase db;
public static final Uri CONTENT_URI = Uri.parse("content://"+ PROVIDER + "/kontakt");
private static final UriMatcher uriMatcher;
static
{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER, "kontakt",MKONTAKT);
uriMatcher.addURI(PROVIDER, "kontakt/#",KONTAKT);
}
@Override
public boolean onCreate()
{
DBhelper=new DBHandler(getContext());
db=DBhelper.getWritableDatabase();
return true;
}
public String getType(Uri uri)
{
switch (uriMatcher.match(uri))
{
case MKONTAKT:return "vnd.android.cursor.dir/vnd.example.kontakt";
case KONTAKT:return "vnd.android.cursor.item/vnd.example.kontakt";
default: return "Illegal uri"; // throw new IllegalArgumentException("Illeagal URI" + uri)
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) //matches MKontakt and deletes every row, instead of matching with KONTAKT
{
if (uriMatcher.match(uri)==KONTAKT)
{
db.delete(TABLE_kontakt, KEY_ID + "=" + uri.getPathSegments().get(1),selectionArgs);
getContext().getContentResolver().notifyChange(uri,null);
return 1;
}
if (uriMatcher.match(uri) == MKONTAKT)
{
db.delete(TABLE_kontakt,null,null);
getContext().getContentResolver().notifyChange(uri,null);
return 2;
}
return 0;
}
// more code under here
AndroidManifest.xml中的相关代码
<uses-permission android:name="android.permission.READ_CONTACTS" ></uses-permission>
<uses-permission android:name="com.example.prosjekt3.permission"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<permission android:name="com.example.prosjekt3.permission"/>
以及:
所以我不明白为什么它会删除每一行而不是一行
发生这种情况是因为您使用delete()
方法时使用了CONTENT\u URI
。现在,在delete()
方法中传递一个与MKONTAKT
相对应的CONTENT\u URI
,以便删除所有内容。相反,CONTENT\u URI
需要附加一个id来匹配KONTAKT
(正如您在UriMatcher
中声明的那样):
你能试试这个
getContentResolver().delete(mybaseuri,“\u ID='”+参数+”,null)代码>您好,谢谢回答:)我假设mybaseuri与我代码中的内容URI相同。我试了两次你说的话,但它仍然在删除每一行,而不是只删除一行。嘿,谢谢回答:)。当我运行你的删除方法时,应用程序崩溃,我得到一个IllegalArgumentException。“java.lang.RuntimeException:无法启动activity ComponentInfo{com.example.ProsJet3/com.example.ProsJet3.MainActivity}:java.lang.IllegalArgumentException:绑定参数太多。提供了1个参数,但语句需要0个参数。”@Madde如果要将id合并到Uri中,那么这些选择参数是无用的:db.delete(TABLE_kontakt,KEY_id+“=”+Uri.getLastPathSegment(),null)代码>(在提供程序的delete()方法中)。嘿,你是对的:)它现在可以正常工作了,谢谢帮助:)
<provider android:name="com.example.prosjekt3.KontaktCP"
android:authorities="com.example.prosjekt3"
android:enabled="true"
android:exported="true"
android:readPermission="com.example.prosjekt3.permission"
android:writePermission="com.example.prosjekt3.permission">
</provider>
getContentResolver().delete(Uri.withAppendedPath(CONTENT_URI, "1"), selectionclause, arguments);