varios repetitivo reiniciar pasados los google eventos evento eliminar cómo cumpleaños compartido como calendario borrar android calendar android-calendar

android - repetitivo - eliminar varios eventos google calendar



Eliminar eventos del calendario que no se están eliminando (3)

Estoy tratando de hacer que mi aplicación agregue recordatorios al calendario del usuario. El código busca el title y la start date para verificar si el evento ya existe en el calendario antes de agregarlo (para no tener duplicados). Mi problema es que: si elimino el evento del calendario manualmente (usando el calendario), el evento desaparece del calendario (estoy viendo todos mis calendarios y no puedo verlo en la aplicación del calendario) pero no de la base de datos. Otra cosa que no entiendo es que intenté eliminar los eventos mediante programación, pero aún así no se eliminan.

Aquí está mi fragmento de código:

Cursor cur = null; ContentResolver cr = getContentResolver(); String calUriString = "content://com.android.calendar/events"; Uri cal=Uri.parse(calUriString); String[] EVENT_PROJECTION=new String[]{"calendar_id","title","dtstart","_id"}; String selection = "((" + "calendar_id" + " = 1) AND (" + "title" + " LIKE ''"+name+"'') AND (" + "dtstart" + " = "+String.valueOf(c.getTimeInMillis())+"))"; cur = cr.query(cal, EVENT_PROJECTION, selection, null, null); boolean found=false; if(cur!=null) if(cur.moveToFirst()){ DatabaseUtils.dumpCursor(cur);/*Just to view my results (which always include the deleted events)*/ do{ if(cur.getString(1).equals(name)){ /*I use this part to try to remove the events manually*/ Uri eventUri =ContentUris.withAppendedId(cal, Long.valueOf(cur.getString(3))); String reminderUriString = "content://com.android.calendar/reminders"; Uri remUri =Uri.parse(reminderUriString); cr.delete(remUri, "event_id="+cur.getString(3), null); cr.delete(eventUri, null, null); /*It is not working also*/ Toast.makeText(getApplicationContext(), "Event already exists in Calendar", Toast.LENGTH_LONG).show(); found=true; //break; } }while(cur.moveToNext()); } cur.close(); if(found){ /*Event is found even if I remove it from the Calendar manually and even if I remove it programmatically using cr.delete()*/ } else{ values.put("calendar_id",1); /*I am using the same Calendar that I query, or is this wrong*/ values.put("title", name); /*More values are added*/ Uri calendarUri = cr.insert(cal, values); long eventID = Long.parseLong(calendarUri.getLastPathSegment()); String reminderUriString = "content://com.android.calendar/reminders"; ContentValues reminderValues = new ContentValues(); reminderValues.put("event_id", eventID); reminderValues.put("minutes", 5); reminderValues.put("method", 1); Uri reminderUri = getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues); }

¿Por qué los eventos siguen presentes después de eliminarlos de la aplicación del calendario y por qué no puedo eliminarlos incluso de manera programática?

Actualizar El problema es solo si uso calendar_id=1 para insertar y eliminar. Otros calendar_id s funcionan bien.

Actualización 2 Probé el código en el Samsung Galaxy S1 y está funcionando bien. Parece ser un problema en Samsung Galaxy S3 (donde tengo mi problema, creo que es un error en la aplicación S-planner)


Diferentes versiones de Android utilizan diferentes rutas URI para buscar datos de calendario. Por ejemplo, podría usar las siguientes constantes para Android 2.1 y 2.2:

private static final String URI_VERSION_2_1 = "content://calendar/events"; private static final String URI_VERSION_2_2 = "content://com.android.calendar/events";

En 4.0 se prefiere un método diferente:

http://android-developers.blogspot.com/2011/10/ics-and-non-public-apis.html http://developer.android.com/reference/android/provider/CalendarContract.Events.html

Hay una buena probabilidad de que el Galaxy S3 tenga al menos Android 4.0 en él. Este cambio puede explicar el código que funciona en un S1, pero no en un S3.


Si no es un problema de URI,

¿Puedes intentar incluir en la cadena de selección?

AND (deleted != 1)

así se convierte la cadena de selección,

String selection = "((" + "calendar_id" + " = 1) AND (" + "title" + " LIKE ''"+name+"'') AND (" + "dtstart" + " = "+String.valueOf(c.getTimeInMillis())+") AND ( deleted != 1 ) )";

Ocasionalmente, CalendarDB toma algún tiempo para que se eliminen los eventos. Pero la COLUMNA ''eliminada'' se marcará como ''1'', lo que indica que se eliminarán pronto. La razón de la demora, tal vez el calendario está esperando para ser sincronizado

ps: intente usar esta herramienta: http://www.cellobject.net/Tools/CellObjectSQLiteXMLBrowser.aspx para visualizar la base de datos del calendario. Por favor verifique las columnas ''borradas'' y ''sucias'' en la base de datos


También puedes hacer algo como esto:

private boolean isEventInCal(Context context, String id) { Uri event = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, Long.parseLong(id)); Cursor cursor = context.getContentResolver().query(event, null, null, null, null); if (cursor != null && cursor.getCount() == 1) { //the event exists? if (cursor.moveToFirst() && !TextUtils.equals(cursor.getString(cursor.getColumnIndex("deleted")), "1")) { cursor.close(); return true; } else { return false; } } return false; }

Funciona en todos los dispositivos.