La eliminación de eventos del calendario no se ha eliminado
Estoy intentando que mi aplicación agregue recordatorios al Calendario del usuario. El código busca el title
y la start date
para comprobar si el evento ya existe en el Calendario antes de añadirlo (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 de calendario) pero no de la base de datos. Otra cosa que no entiendo es que intenté quitar los acontecimientos programmatically, pero todavía no se quitan.
Aquí está mi fragmento de código:
- Cómo iniciar la aplicación de calendario de Android con Intent (Froyo)
- ¿Dónde puedo obtener el código fuente de Android 1.5 y 1.6?
- Sincronización del proveedor del calendario para Android: columnas SYNC_DATA?
- ¡Ayuda! ¿Cómo puedo crear una aplicación de calendario para Android?
- Android - ¿Cómo se especifica una ubicación al llamar al calendario con una intención?
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é siguen presentes los sucesos después de eliminarlos de la aplicación de calendario y por qué no puedo eliminarlos incluso mediante programación?
Actualización El problema es sólo si uso calendar_id=1
para insertar y eliminar. Otros calendar_id
s funcionan bien.
Actualización 2 He probado el código en 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)
- Intención que abre la actividad de "evento de calendario nuevo"
- Android- Eliminar Calendarview de DatePickerDialogFragment
- Android - Nuevo estilo de calendario DatePicker y TimePicker
- Eliminar y actualizar el evento de calendario existente
- Establecer la repetición de la alarma cada día a una hora específica En Android
- Cómo crear un receptor para crear un nuevo evento
- Vista de calendario para Android GingerBread y antes (API <11)
- Webcal / .ics se suscriben al feed de la aplicación de Android
Si no es un problema URI,
¿Puedes intentar incluir en la cadena de selección
AND (deleted != 1)
Por lo que la cadena de selección se convierte,
String selection = "((" + "calendar_id" + " = 1) AND (" + "title" + " LIKE '"+name+"') AND (" + "dtstart" + " = "+String.valueOf(c.getTimeInMillis())+") AND ( deleted != 1 ) )";
Ocasionalmente, el CalendarDB toma algún tiempo para que los eventos se eliminen. Pero la COLUMNA "borrada" se marcará como "1", indicando que se borrarán pronto. El motivo del retraso tal vez el calendario está a la espera de sincronizarse
Ps: Intente usar esta herramienta – http://www.cellobject.net/Tools/CellObjectSQLiteXMLBrowser.aspx para visualizar el DB de calendario. Compruebe las columnas "suprimidas" y "sucias" en el db
Diferentes versiones de android utilizan diferentes rutas URI para buscar datos de calendario. Por ejemplo, puede utilizar 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 tiene al menos Android 4.0 en él. Este cambio puede explicar el código que trabaja en un S1, pero no en un S3.
- ¿Cómo saber si un fragmento es visible?
- Cambiar la altura de la barra de acción en Android JellyBean