L'appel de la méthode delete dans la coutume de fournisseur de contenu
Je suis en train d'apprendre Android et je suis bloqué sur un problème concernant l'appel d'une coutume de fournisseur de contenu. J'ai été en utilisant un exemple dans un livre d'instructions et, bien qu'elle décrit comment créer le fournisseur personnalisé il n'y a pas d'exemple clair comment appeler les méthodes spécifiques. Je recherche précisément dans la façon de supprimer un seul enregistrement de la coutume de fournisseur de contenu.
Voici le code pour le contenu personnalisé fournisseur (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;
}
Je suis en train d'appeler la méthode delete de l'activité principale pour supprimer une seule entrée, et non pas l'ensemble de la base de données. Je veux l'utiliser sur un OnLongClickListener
pour l'enregistrement sélectionné est affiché dans un tableau d'affichage de la liste dans l'activité principale.
C'est ce que j'ai je l'ai dans mon activité principale pour cette méthode:
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;
}
Je sais que le code ci-dessus ne fonctionne pas, mais c'est aussi proche que j'ai pu avoir avec mes connaissances actuelles.
Toute aide sur ce serait très apprécié.
OriginalL'auteur Jeff | 2011-03-10
Vous devez vous connecter pour publier un commentaire.
C'est votre problème. Tout d'abord, le contexte:
Contenu Uri: (source)
Le numéro à la fin est facultative. Dans ce cas, les références URI d'une ligne spécifique dans la base de données où la rangée._id=(le nombre). En cas d'absence, il fait référence à la table dans son ensemble.
le supprimer() qui accepte un URI, une clause where, et un ensemble de chaînes de caractères qui se substitué à l'. Exemple: Disons que vous avez une base de données de personnes.
Recherche le long d'une table, et de supprimer toute personne dont le sexe est masculin et dont la couleur des yeux est bleu.
Si la clause where et où les valeurs sont nulles, puis le supprimer() va correspondre à chaque ligne de la table. Cela provoque le problème voyez-vous.
Il existe deux méthodes pour spécifier la ligne que vous voulez:
Première option, vous pouvez ajouter le numéro de l'URI:
Cette limite à l'URI d'une ligne spécifique, et le chemin sera par le biais de votre
case QUAKE_ID:
déclaration et donc ne supprimez une ligne, peu importe quoi.Deuxième option, vous pouvez utiliser une clause where:
De toute façon, vous vous engagez à restreindre la suppression d'une seule ligne, comme vous en avez besoin. Ce dernier fait plus joli code, mais le premier est plus efficace, en raison de la façon dont le ContentProvider et ContentObservers travail.
Comme une dernière remarque: Dans votre ContentProvider vous avez besoin d'ajouter un appel à
ContentResolver.notifyChange(Uri Uri, ContentObserver observateur, boolean syncToNetwork). Cela permet de notifier les curseurs pour récupérer à nouveau la requête de base de données et aide beaucoup avec l'automatisation.
Merci, j'ai fait les modifications à l'aide de la première suggéré code. J'obtiens une erreur fatale quand je le lance dans l'émulateur: java.lang.IllegalArgumentException: non pris en charge URI: content://com.paad.fournisseur de.tremblement de terre/tremblements de terre/1. Ce devrait être la bonne URI mais sa fonctionne pas...?
Quelle ligne dans le code lance cette exception?
C'est à partir de la LOGCAT: ERREUR/AndroidRuntime(370): FATAL EXCEPTION: ERREUR/AndroidRuntime(370): java.lang.IllegalArgumentException: non pris en charge URI: content://com.paad.fournisseur de.tremblement de terre/tremblements de terre/1 ERREUR/AndroidRuntime(370): au com.paad.tremblement de terre.EarthquakeProvider.supprimer(EarthquakeProvider.java:103). Ligne 103 est le "défaut: throw new Illégal... en ligne" dans le earthquakeProvider. Je peux copier l'intégralité du journal des erreurs, mais il l'habitude de tenir dans la section des commentaires.
La droite. Donc, URI matcher ne fonctionne pas. Vous en avez besoin pour correspondre à une uri avec le numéro ci-joint. Vous avez besoin de quelque chose comme: uriMatcher.addURI(AUTORITÉ, EarthquakeProvider.CONTENT_URI.toString+"/#", QUAKE_ID); -- Il n'est pas de trouver votre uri dans la liste des choses que votre uriMatcher est à la recherche d', de sorte que votre second cas, le bloc n'est jamais appelée. C'est un problème distinct de votre question initiale.
OriginalL'auteur