2016-06-05 1 views
0

J'essaie de gérer les événements de calendrier dans mon application en utilisant le fournisseur de calendrier d'Android. Sur la documentation page les méthodes suivantes pour supprimer un événement et à ouvert un événement dans le calendrier sont présentés:Un EVENT_ID Android est-il unique sur plusieurs calendriers?

Pour supprimer un événement:

private static final String DEBUG_TAG = "MyActivity"; 
... 
long eventID = 201; 
... 
ContentResolver cr = getContentResolver(); 
ContentValues values = new ContentValues(); 
Uri deleteUri = null; 
deleteUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID); 
int rows = getContentResolver().delete(deleteUri, null, null); 
Log.i(DEBUG_TAG, "Rows deleted: " + rows); 

Pour ouvert un événement spécifique dans le calendrier en utilisant l'intention du calendrier:

long eventID = 208; 
... 
Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID); 
Intent intent = new Intent(Intent.ACTION_VIEW) 
    .setData(uri); 
startActivity(intent); 

Rks plutôt bien mais j'ai remarqué que, contrairement à d'autres transactions telles que la création et la récupération d'événements, l'ID du calendrier ne semble pas avoir de signification. Pourquoi est-ce si? Puis-je supposer que le système garantit que tous les ID d'événement sont uniques dans tous les calendriers? Ou pourrait-il y avoir plusieurs événements avec le même ID, et que se passe-t-il alors?

+0

Le fait que la table des événements inclut une colonne pour l'ID du calendrier suggère que tous les calendriers partagent la même table d'événements. Cela signifierait que les ID d'événement (= ID de ligne?) Sont uniques dans cette table et donc dans tous les calendriers. Je ne suis pas certain de faire confiance à mes conclusions et serais reconnaissant pour un expert de confirmer. – jerry

Répondre

1

Oui, cette hypothèse est correcte. L'ID d'événement que vous transmettez avec les Uri est mappé directement au champ _id de la ligne, qui correspond à la clé primaire de la table des événements. Chaque événement possède donc un identifiant unique (au niveau du système).

Si vous suivez les appels de deleteEventsInternal dans CalendarProvider2, vous pouvez voir que l'ID que vous avez passé est comparé au champ _id de la table des événements.

La sélection line 3222 évalue finalement à _id = <the ID you passed>

En ce qui concerne votre question: « Pourquoi est-ce pas? »:

La relation entre les calendriers et les événements est un à plusieurs, ce qui signifie un calendrier peut contenir plusieurs événements, mais un événement appartient à exactement un calendrier.

La façon dont cela est représenté dans la base de données de calendrier est le moyen standard de modélisation dans cette base de données relationnelles, voir http://www.databaseprimer.com/pages/relationship_1tox/

Dans la conception de base de données ceci est aussi appelé le Second normal form.