" getContentResolver()删除()&#34。删除每一行而不是一行

时间:2014-10-21 13:34:06

标签: android database android-contentprovider

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

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

我目前已经对这个论点进行了硬编码,因为我只是在测试。但我已经检查过,当我运行程序时,数据库中存在值为1的_ID。并且其他_ID不是1.

MainActivity中的相关代码:

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"/>

和:

    <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>      

1 个答案:

答案 0 :(得分:1)

  

所以我不明白为什么它会删除每一行而不只是一行

由于您使用CONTENT_URI方法delete()而发生这种情况。现在,您在CONTENT_URI方法中传递了与MKONTAKT对应的delete(),因此您将删除所有内容。相反,CONTENT_URI需要附加一个ID才能匹配KONTAKT(正如您在UriMatcher中声明的那样):

getContentResolver().delete(Uri.withAppendedPath(CONTENT_URI, "1"), selectionclause, arguments);