2013-02-20 14 views
25

Uygulamamı, kullanıcının Takvimine hatırlatıcı eklemesini sağlamaya çalışıyorum. Kod, olayın eklenmeden önce takvimde bulunup bulunmadığını kontrol etmek için title ve start date numaralarını arar (çoğaltmaları olmamak için). Benim sorunum şudur: Olayı Takvim'den manuel olarak (Takvim kullanarak) kaldırırsam, olay Takvim'den kaybolur (Tüm Takvimlerimi görüntülüyorum ve bunu Takvim Uygulaması'nda göremiyorum) ancak DataBase'den göremiyorum. Anlamadığım bir başka şey ise, olayları programsal olarak kaldırmaya çalıştığım ama yine de kaldırılmadıkları. İşte Takvimden silinme olayları silinmiyor

benim kod parçacığı geçerli:
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); 
    } 

Neden etkinlik takvimi Uygulama çıkardıktan sonra hala mevcut ve neden bile programlı kaldırmak mümkün değilim?

Güncelleme Sorun ekleme ve silme için calendar_id=1 kullanmak durumunda olduğunu. Diğer calendar_id s iyi çalışıyor.

Güncelleştirme 2 Samsung Galaxy S1 üzerindeki kodu test ettik ve çalışıyor. Samsung Galaxy S3'te bir sorun var gibi görünüyor (nerede sorunum var, S-planner uygulamasında bir hata olduğunu düşünüyorum)

+0

Uygulamanızı yeniden başlatırsanız, silinmiş etkinlikler yine de görünür mü? – NathanTempelman

+0

Evet, telefonu yeniden başlatsam bile, Takvim Uygulaması'nda görünmezler, ancak yine de ContentResolver'da görünürler.query() –

+0

@Mohamed_AbdAllah Bu durumun geçerli olup olmadığını kesin olarak söyleyemem ama tür ve müzik ile ilgili sorgularda benzer sorunlar görülebilir. Onun bir hata olup olmadığını anlamanız gerekir =/ – Warpzit

cevap

17

onun değil bir URI sorun

Seçim dize

AND (deleted != 1) 

yüzden seçim dize olur dahil etmek deneyebilir miyim, bazen

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

, CalendarDB bazen alırsa olaylar kaldırılacak. Ancak 'silinmiş' COLUMN, yakında silineceklerini belirten '1' olarak işaretlenecektir. Gecikme nedeni belki de takvimin

p.s: Bu aracı kullanmayı denemesini sağlayın - Takvim DB'yi görselleştirmek için http://www.cellobject.net/Tools/CellObjectSQLiteXMLBrowser.aspx. Ayrıca böyle bir şey yapabileceği

+1

S-planner Uygulamasında Galaxy S3'te hala bir hata var, çünkü silinmiş olaylar hiç bahsetmediğiniz zamanla silinmez. Kodunuz, silinen olayları sorgu sonucundan filtrelemeye çalışır, ancak telefonumu Açık ve Kapalı olarak değiştirdim ve çok zaman bekledim ve olaylar hala ContentProvider DB'de (sütun silindi = 1 olsa da) ve hiçbir zaman kaldırılmadı. –

+0

Etkinliğin silineceği Takvimde (Exchange hesabı veya Google hesabı gibi) herhangi bir senkronizasyon var mı? Öyleyse, senkronize edilmesi ve silinmesi biraz zaman alır. –

+1

İki aydan beri bu konuyla karşı karşıya kaldım ve iki ay önce eklediğim veriler hala mevcut (silinmiş haliyle). Bunun bir zaman meselesi olduğunu düşünmüyorum. –

1

Android'in farklı sürümleri takvim verilerini ararken farklı URI yollarını kullanır. Bir başka yöntem tercih edilir In 4.0

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

: Örneğin, android 2.1 ve 2.2 için aşağıdaki sabitleri kullanabilirsiniz

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

Orada iyi bir şans olduğunu Galaxy S3 En azından Android 4.0 var. Bu değişiklik S1 üzerinde çalışan koddan sorumlu olabilir, ancak S3 üzerinde çalışamaz.

+1

Bu bir URI sorunu değil. Ben zaten a/m URI kullanarak verileri buluyorum ve S-Planner'dan silinirse İmlecede hala görülebilir. URI'yi değiştirmeyi denedim, ama aynı çıktıyı elde ediyorum. –

+0

Tamam. Tahminlerimden biri,> = 4.0 değil ve yeni API'ları kullanmıyorsanız, Google'ın iyi şanslar olduğunu, kodunuzun muhtemelen bir noktada kırılacağını tahmin ediyorum. Bunun sana çok fazla yardım etmediğini biliyorum, ama bu onların resmi ifadesi. – Shellum

+1

Desteğiniz için teşekkür ederim, ancak SDK başına URI'yi belirtmek de dahil olmak üzere neredeyse her şeyi denedim. –

0

db 'silindi' ve 'kirli' sütunlar için kontrol edin:

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; 
} 

Tüm cihazlarda çalışır.