gpt4 book ai didi

android - 在自定义内容提供程序中调用删除方法

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:34:39 27 4
gpt4 key购买 nike

我正在学习 Android,但遇到了一个涉及调用自定义内容提供商的问题。我一直在使用一本指导书中的示例,虽然它描述了如何创建自定义提供程序,但没有明确的示例如何调用其中的特定方法。我正在专门研究如何从自定义内容提供程序中删除单个记录。

这是自定义内容提供程序的代码 (EarthquakeProvider.java):

@Override


public int delete(Uri uri, String where, String[] whereArgs) {
int count;

switch (uriMatcher.match(uri)) {
case QUAKES:
count = earthquakeDB.delete(EARTHQUAKE_TABLE, where, whereArgs);
break;

case QUAKE_ID:
String segment = uri.getPathSegments().get(1);
count = earthquakeDB.delete(EARTHQUAKE_TABLE, KEY_ID + "="
+ segment
+ (!TextUtils.isEmpty(where) ? " AND ("
+ where + ')' : ""), whereArgs);
break;

default: throw new IllegalArgumentException("Unsupported URI: " + uri);
}

getContext().getContentResolver().notifyChange(uri, null);
return count;


}

我试图从主 Activity 调用删除方法来删除单个条目,而不是整个数据库。我想对显示在主要 Activity 的数组 ListView 中的选定记录使用 OnLongClickListener

这是我到目前为止在主要 Activity 中针对此方法得出的结论:

earthquakeListView.setOnItemLongClickListener(new OnItemLongClickListener() {

@Override
public boolean onItemLongClick(AdapterView _av, View _v, int _index,
long arg3) {
ContentResolver cr = getContentResolver();
cr.delete(earthquakeProvider.CONTENT_URI, null, null);

return false;
}

我知道上面的代码不起作用,但这是我目前理解的最接近的代码。

如有任何帮助,我们将不胜感激。

最佳答案

cr.delete(earthquakeProvider.CONTENT_URI, null, null);

这是你的问题。首先,一些背景:

内容 URI:( source )

content://authority/path/##

末尾的数字是可选的。如果存在,则 URI 引用数据库中的特定行,其中 row._id=(the number)。如果不存在,它将引用整个表。

delete() 调用接受一个 URI、一个 where 子句和一组被替换的字符串。示​​例:假设您有一个人员数据库。

cr.delete(
Person.CONTENT_URI,
"sex=? AND eyecolor=?",
new String[]{"male", "blue"});

将搜索整个人表,并删除性别为男性且眼睛颜色为蓝色的人。

如果 where 子句和 where 值为空,则 delete() 调用将匹配表中的每一行。这会导致您看到的行为。

有两种方法可以指定你想要的行:

第一个选项,您可以将数字附加到 URI:

cr.delete(
EarthquakeProvider.CONTENT_URI.buildUpon().appendPath(String.valueOf(_id)).build(),
null, null);

这将 URI 限制为特定行,路径将通过您的 case QUAKE_ID: 语句,因此无论如何只会删除一行。

第二种选择,您可以使用 where 子句:

cr.delete(EarthquakeProvider.CONTENT_URI, "_id=?", String.valueOf(_id)));

无论哪种方式,您都可以根据需要将删除限制为单行。后者使代码更漂亮,但由于 ContentProvider 和 ContentObservers 的工作方式,前者效率更高。

最后一点:在您的 ContentProvider 中,您需要添加对ContentResolver.notifyChange(Uri uri,ContentObserver 观察者,boolean syncToNetwork)。这有助于通知游标重新获取数据库查询,并有助于实现自动化。

关于android - 在自定义内容提供程序中调用删除方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5267348/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com