我正在尝试创建自己的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>
答案 0 :(得分:1)
所以我不明白为什么它会删除每一行而不只是一行
由于您使用CONTENT_URI
方法delete()
而发生这种情况。现在,您在CONTENT_URI
方法中传递了与MKONTAKT
对应的delete()
,因此您将删除所有内容。相反,CONTENT_URI
需要附加一个ID才能匹配KONTAKT
(正如您在UriMatcher
中声明的那样):
getContentResolver().delete(Uri.withAppendedPath(CONTENT_URI, "1"), selectionclause, arguments);