Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android &引用;getContentResolver().delete();删除每一行而不是仅删除一行_Android_Database_Android Contentprovider - Fatal编程技术网

Android &引用;getContentResolver().delete();删除每一行而不是仅删除一行

Android &引用;getContentResolver().delete();删除每一行而不是仅删除一行,android,database,android-contentprovider,Android,Database,Android Contentprovider,我正在尝试创建自己的ContentProvider,目前正在同一个应用程序中测试它。插入方法工作正常。但是当我试图删除一行时。它最终会删除每一行,而不仅仅是我选择的那一行。我发送的是select on子句和它应该删除的参数,所以我不明白为什么它会删除每一行而不是一行 在KontaktCP中,delete方法似乎认为我发送的不是参数。因为它与MKONTAKT而不是KONTAKT匹配,因此会删除每一行 我目前已经硬编码了这个论点,因为我只是在测试。但我已经检查了在运行程序时,数据库中是否存在值为1的

我正在尝试创建自己的ContentProvider,目前正在同一个应用程序中测试它。插入方法工作正常。但是当我试图删除一行时。它最终会删除每一行,而不仅仅是我选择的那一行。我发送的是select on子句和它应该删除的参数,所以我不明白为什么它会删除每一行而不是一行

在KontaktCP中,delete方法似乎认为我发送的不是参数。因为它与MKONTAKT而不是KONTAKT匹配,因此会删除每一行

我目前已经硬编码了这个论点,因为我只是在测试。但我已经检查了在运行程序时,数据库中是否存在值为1的_ID。另外一个ID不是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);