IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Effacement d'un rendez-vous dans l'agenda


Sujet :

Android

  1. #1
    Membre habitué Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Points : 197
    Points
    197
    Par défaut Effacement d'un rendez-vous dans l'agenda
    Bonjour,

    Je cherche vainement à effectuer un effacement d'un rendez-vous du calendrier, si quelqu'un sait comment faire, je suis preneur...

    J'essaie de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Uri eventsUri = Uri.parse(uriCal + "/events");
    Uri uri = ContentUris.withAppendedId(eventsUri, eventid);	/* content://calendar/events/636 */
    contentResolver.delete(uri, null /* where */, null /* selectionArgs */);
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static final String uriCal = "content://calendar";
    Je renseigne bien le eventid (long), mais il ne delete rien du tout !

    Merci d'avance...
    Christian
    Nexus 1 sous Cyanogen - Acer A500

  2. #2
    Membre habitué Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Points : 197
    Points
    197
    Par défaut
    Je suis passé sur Froyo, en changeant l'uri du calendar (content://com.android.calendar au lieu de content://calendar), et avec le même code, il m'indique que les rendez-vous sont supprimés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nb=contentResolver.delete(uri, null /* where */, null /* selectionArgs */);
    donne nb=1 pour chacun des rendez-vous que je veux supprimer (avant il donnait 0 !), mais lorsque je consulte mon agenda, les rendez-vous supprimés sont toujours là...

    Quelqu'un aurait-il une idée ?
    Christian
    Nexus 1 sous Cyanogen - Acer A500

  3. #3
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Salut,

    As-tu bien regardé le code source du SDK pour voir où pouvait être ton erreur ?

    Pour rappel :
    http://www.google.co.in/codesearch/p...java%20android
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  4. #4
    Membre habitué Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Points : 197
    Points
    197
    Par défaut
    Je vais encore regarder, mais jusqu'à présent je ne trouve pas grand chose...
    Christian
    Nexus 1 sous Cyanogen - Acer A500

  5. #5
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    N'y a t-il pas une permission à mettre pour modifier le calendrier ?
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  6. #6
    Membre habitué Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Points : 197
    Points
    197
    Par défaut
    Oui effectivement, et mon manifest contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <uses-permission
    	    android:name="android.permission.READ_CALENDAR">
    </uses-permission>
    <uses-permission
    	    android:name="android.permission.WRITE_CALENDAR">
    </uses-permission>
    C'est bizarre car j'arrive à lire les rendez-vous, à les créer, mais pas à les effacer...

    Il est possible que le problème vienne de l'uri qui ne serait pas bonne, c'est la seule explication que je vois... pourtant j'utilise la même uri pour créer un rendez-vous et là ça marche.

    J'ai trouvé un projet qui travaille sur le calendrier, mais il fait un import :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import android.provider.Calendar;
    import android.provider.Calendar.Events;
    et dans mon projet si je fais cet import, il me met une erreur (the import cannot be resolved), et dans cet exemple, l'uri prise est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Uri uri = ContentUris.withAppendedId(Calendar.Events.CONTENT_URI, id);
    mContentResolver.delete(uri, null /* where */, null /* selectionArgs */);
    Christian
    Nexus 1 sous Cyanogen - Acer A500

  7. #7
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    L'uri qui à l'air d'être utilisée est celle là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public static final String AUTHORITY = "com.android.calendar";
     
    //...
    /**
     * Contains one entry per calendar event. Recurring events show up as a single entry.
      */
    public static final class EventsEntity implements BaseColumns, EventsColumns, CalendarsColumns {
         /**
          * The content:// style URL for this table
          */
         public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/event_entities");
     
     
    //...
    }
    Ou alors t'as ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/events");
    J'ai pas eu à travailler sur les calendrier, donc j'ai pas pu trop me pencher sur la mécanique interne de gestion des "events".

    Est-ce que tu arrives à faire une mise à jour sur un "event" ? Tu l'as fait sur "event" ou "event_entity" ?
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  8. #8
    Membre habitué Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Points : 197
    Points
    197
    Par défaut
    Serait-ce "content://" + AUTHORITY + "/event_entities" ? au lieu de /events ?

    Mince, on se répond en même temps ! quelle synchro !
    Christian
    Nexus 1 sous Cyanogen - Acer A500

  9. #9
    Membre habitué Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Points : 197
    Points
    197
    Par défaut
    Pour créer un rendez-vous, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    		ContentValues event = new ContentValues();
    		event.put("calendar_id", CalId);
    		event.put("title", "TITLE");
    		event.put("eventLocation", "LOCATION");
    		event.put("description", "DESCRIPTION");
    		long now = new Date().getTime();
    		event.put("dtstart", now);
    		event.put("dtend", now + DateUtils.HOUR_IN_MILLIS);
    		// ou pour toute la journée :
    		// event.put("allDay", 1);   // 0 for false, 1 for true
     
    		//Ecriture du rendez-vous dans le calendrier sélectionné :
    		Uri eventsUri = Uri.parse(uriCal + "/events");
    		@SuppressWarnings("unused")
    		Uri url = getContentResolver().insert(eventsUri, event);
    et ça marche, mais si je fais le delete sur "/events", il m'indique en retour 1 (c'est le nombre de rendez-vous supprimés retourné par le contentResolver), mais j'ai toujours mes rendez-vous (non délétés), je vais essayer avec "/event_entities", mais j'ai peur que cet uri concerne les rendez-vous récurrents et pas les "simples"

    J'ai beau regarder, pour moi l'uri à utiliser, c'est "content://" + AUTHORITY + "/events"
    Christian
    Nexus 1 sous Cyanogen - Acer A500

  10. #10
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Quand tu inseres un Event, ça te retourne pas une URI qui décrit où est insérer ton tuple justement ?
    Si oui, as tu essayé d'afficher cet URI pour voir où était stocké ton event ?
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  11. #11
    Membre habitué Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Points : 197
    Points
    197
    Par défaut
    Quand j'insère un event, il lui attribue un numéro (eventId = long), et l'uri pour y accéder c'est "content://com.android.calendar/events/n°" (ce qui me permet de l'afficher).

    Une question : le calendrier est une base de données, donc dans SQL, n'y a-t-il pas une manière particulière d'effacer un élément ? (ou après effacement de le confirmer ?)

    Sinon, comment faire pour récupérer l'uri d'un event créé ?

    Et si il suffisait de mettre l'uri ="content://com.android.calendar/events", et au lieu de mettre null pour row (where), de mettre l'id de l'event ?
    Christian
    Nexus 1 sous Cyanogen - Acer A500

  12. #12
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Bah je te conseillerais d'essayer, et de nous dire si ça fonctionne
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  13. #13
    Membre habitué Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Points : 197
    Points
    197
    Par défaut
    Je veux essayer ma dernière idée, mais je ne sais pas comment convertir un long en String[]...

    Je fais ça : String id[] = {String.valueOf( eventid )};

    Dommage : PLANTAGE !
    Christian
    Nexus 1 sous Cyanogen - Acer A500

  14. #14
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String[] tabStr = new String[1];
    tabStr[0] = String.valueOf(monLong);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String[] tabStr = new String[1];
    tabStr[0] = "" + monLong;
    ou quelques choses comme ça...
    Je te laisse chercher la meilleur solution, je suis pas sûr que celle que je te propose soit les plus efficaces (en consommation mémoire par exemple)
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  15. #15
    Membre habitué Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Points : 197
    Points
    197
    Par défaut
    Tu es super rapide !

    C'est bien ma conversion qui ne marche pas...

    J'essaie ta méthode.

    [EDIT : Résultat]

    Re-dommage : PLANTAGE !

    En fait ma méthode fonctionnait, j'avais juste mal affiché (id au lieu de id[0]), mais bref, ça ne marche pas...

    Bon je continue à chercher, dès que je trouve, je donne la solution...

    Merci à toi pour ton aide.
    Christian
    Nexus 1 sous Cyanogen - Acer A500

  16. #16
    Membre habitué Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Points : 197
    Points
    197
    Par défaut
    J'ai essayé de nombreuses uri, rien à faire (plantages), les deux seules choses qui semblent "fonctionner" (pas de plantage), c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Uri eventsUri = Uri.parse(uriCal + "/events");
    int nb = contentResolver.delete(eventsUri, "_id="+id, null);	// nb = nombre de RdV effacés
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Uri eventsUri = Uri.parse(uriCal + "/events");
    Uri uri = ContentUris.withAppendedId(eventsUri, eventid);
    int nb = contentResolver.delete(uri, null , null);
    eventid étant un long et id une string (avec id="eventid")

    Lorsque j'exécute l'un ou l'autre de ces codes, sur mes 6 events, il me retourne nb=0 pour les 2 premiers et les 3 derniers, et nb=1 pour le troisième. Les id de ces events sont : 17, 38, 124, 36, 16, et 9.

    Au final, AUCUN des events n'est effacé...

    Je ne comprends rien ! Si Google empêche l'effacement des events par code, autant qu'ils le disent qu'on ne perde pas de temps avec ça...
    Christian
    Nexus 1 sous Cyanogen - Acer A500

  17. #17
    Membre habitué Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Points : 197
    Points
    197
    Par défaut
    Ben c'est un peu ça, quelqu'un de Google (très sympa d'ailleurs), m'a vivement conseillé de ne pas utiliser les API privées ! Donc je vais voir pour une autre solution...

    J'ai encore eu une réponse d'une autre personne de Google, lui aussi très sympa , mais il m'a en plus donné des billes et l'explication pourquoi ça ne marche pas...

    Pour ceux que ça intéressent et en attendant que je trouve la solution, voici son email :
    Nous ne pouvons pas commenter ni
    donner des infos sur des API "privees". Maintenant, un petit coup de

    adb shell sqlite3
    /data/data/com.android.providers.calendar/databases/calendar.db
    ".schema"

    donnera le schema et permettra de voir la relation entre les tables
    "instances" et "events" en particulier la foreign key "event_id".

    Le pb avec le code present est que la requete sur la table "instances"
    ne retourne que l'ID de l'instance et non pas "event_id" et donc la
    requete delete ne fait rien ou meme supprime des events qui ne sont
    pas dans la plage demandee. Enfin toute URI constante doit etre
    extraite comme "static final" et non pas a l'interieure de la boucle.
    J'ai bien compris pourquoi mon code ne marchait pas (ce n'était pas le bon id), et maintenant, je cherche à trouver le bon, en m'aidant des conseils de Google.

    Malheureusement, lorsque je fais sqlite3 après avoir fait adb shell (-> téléphone), j'ai un message d'erreur : permission denied !

    Est-ce que quelqu'un peut m'aider à avancer ?

    Merci d'avance.
    Christian
    Nexus 1 sous Cyanogen - Acer A500

  18. #18
    Membre habitué Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Points : 197
    Points
    197
    Par défaut
    Ça y est, j'ai enfin trouvé : il fallait chercher "event_id" au lieu de "_id" !

    Maintenant ça marche !!!


    Merci aux développeurs de Google qui m'ont aidé et à Maitre DuChnock...

    Pour info voici le code qui marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public void EffaceSemaineRdV() {
    // Efface tous les RdV d'une semaine (calendrier CalId seulement !)
     
    	// d'abord on transforme la date (string) en long
    	Time time = new Time();
    	time.parse(dateDébut);
    	long deb = time.normalize(false);
     
    	ContentResolver contentResolver = this.getContentResolver();
    	// récupération des events de la semaine concernée (dont le début est donné par date Début = 20100802 par exemple)	
    	Uri.Builder builder = Uri.parse(uriCal + "/instances/when").buildUpon();
    	ContentUris.appendId(builder, deb);								// début de la semaine
    	ContentUris.appendId(builder, deb + DateUtils.WEEK_IN_MILLIS);	// fin de la semaine
     
    	Cursor eventCursor = contentResolver.query(builder.build(),
    			new String[] { "event_id" }, "Calendars._id=" + CalId,
    			null, "startDay ASC, startMinute ASC");
     
    	while (eventCursor.moveToNext()) {
    		final long eventid = eventCursor.getInt(0);
    	        // effacement du rendez-vous :
    		Uri uri = ContentUris.withAppendedId(eventsUri, eventid);	// content://calendar/events/636
                    contentResolver.delete(uri, null , null );
    	}
     
    }
    Il faut juste déclarer en plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       // URI DE L'AGENDA
    // ATTENTION : pour Froyo, nouvelle URI : content://com.android.calendar au lieu de content://calendar
    //static final String uriCal = "content://calendar";
    static final String uriCal = "content://com.android.calendar";
    static final Uri eventsUri = Uri.parse(uriCal + "/events");
    Christian
    Nexus 1 sous Cyanogen - Acer A500

  19. #19
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Merci de ton retour
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Création d'un rendez-vous dans un agenda Outlook partagé
    Par marwal dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 06/01/2014, 16h27
  2. Google ajoute la prise de rendez-vous dans Google Agenda
    Par Gordon Fowler dans le forum Cloud Computing
    Réponses: 1
    Dernier message: 22/06/2011, 13h22
  3. Effacement d'un rendez-vous dans le calendrier
    Par cad13 dans le forum Android
    Réponses: 2
    Dernier message: 23/04/2010, 11h21
  4. Réponses: 3
    Dernier message: 19/07/2007, 19h21
  5. Creer un rendez-vous dans le calendrier exchange
    Par skywaukers dans le forum Delphi
    Réponses: 1
    Dernier message: 08/01/2007, 22h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo