Pytanie w sprawie android, calendar – Usuń tylko jedno wystąpienie powtarzającego się wydarzenia z mojego kalendarza na Androida

5

Przeglądałem różne posty dotyczące usuwania tylko jednego wystąpienia powtarzającego się wydarzenia z kalendarza telefonu z Androidem 2.3, ale nie udało mi się znaleźć idealnej odpowiedzi. Jak dotąd najlepsze, z którym się spotkałem:

<code>Uri eventsUri = Uri.parse("content://com.android.calendar/events");
Uri deleteEventUri = Uri.withAppendedPath(eventsUri, String.valueOf(id2));
DeleteEventActivity.context.getContentResolver().delete(deleteEventUri, null, null);
</code>

Gdzie id2 to identyfikator zdarzenia, które chcę usunąć. Mam problem polegający na tym, że chcę usunąć tylko jedno wystąpienie zdarzenia cyklicznego, ale ten kod usuwa wszystkie wystąpienia. Czy istnieje sposób na usunięcie tylko jednego wystąpienia? Dzięki.

Czy znalazłeś rozwiązanie tego problemu? nikmin

Twoja odpowiedź

3   odpowiedź
6
Oto podstawyZnajdź instancję, którą chcesz usunąć. (za pomocąInstances.query())Utwórzwyjątek URI z identyfikatorem zdarzeniadołączony.StwórzContentValues. Umieść swoją instancjęZACZYNAĆ wartość jak... Events.ORIGINAL_INSTANCE_TIME. PołożyćSTATUS_CANCELED tak jak... Events.STATUSTeraz tylkowstaw (yourURI, yourValues) i to wszystko!
1

Będziesz musiał zaktualizowaćDODATEKkolumna oryginalnego wydarzenia.

6

Jeśli ktoś jeszcze zmaga się z tym, w końcu go złamałem!

Okazuje się, że nie usuwasz ani nie zmieniasz żadnych rekordów, w rzeczywistości wstawiasz nowe zdarzenie zwane wyjątkiem. Kilka miesięcy zajęło mi znalezienie tych informacji w dowolnym miejscu, a nawet po ich znalezieniu, jeszcze kilka miesięcy, aby opracować dokładnie to, co trzeba umieścić w wyjątku, aby działał, więc oto jak to zrobiłem.

Po pierwsze, zapytaj rzeczywiste wystąpienie zdarzenia, które chcesz anulować, jednego wystąpienia. Musisz wywołać tabelę CalendarContract.Instances, aby uzyskać wartości CalendarContract.Instances.TITLE, CalendarContract.Instances.BEGIN i CalendarContract.Instances.EVENT_ID. Sposób, w jaki to robię w moim kodzie, nie pasuje tak naprawdę do kontekstu tej odpowiedzi, więc mam nadzieję, że będziesz w stanie samemu to zrobić. Zapisz te wartości jako:

final String title = eventCursor.getString(0); final long beginl=eventCursor.getLong(1); final int id = eventCursor.getInt(2);

Następnie musimy skonfigurować nowe wydarzenie w następujący sposób:

<code> final Context context = getApplicationContext();
 final ContentResolver contentResolver = context.getContentResolver();
 final Uri.Builder builder = Uri.parse(
"content://com.android.calendar/events").buildUpon();
 final Cursor eventCursor = contentResolver.query(builder.build(),
new String[] 
   {Events.CALENDAR_TIME_ZONE,Events.ALL_DAY,Events.CALENDAR_ID,Events._SYNC_ID,     Events.OWNER_ACCOUNT }, 
   "_id=" + id, null, null);
 while (eventCursor.moveToNext()) {
final String timezone=eventCursor.getString(0);
final String allday=eventCursor.getString(1);
final long calID=eventCursor.getLong(2);
final String mSyncId=eventCursor.getString(3);
final String account=eventCursor.getString(4);
ContentValues values = new ContentValues();
    values.put(Events.TITLE, title);
    values.put(Events.EVENT_TIMEZONE, timezone);
values.put(Events.ORIGINAL_SYNC_ID, mSyncId);//not 100% sure about this,may also need a date?
values.put(Events.HAS_ALARM, "0");
values.put(Events.HAS_ATTENDEE_DATA,"0");
values.put(Events.ALL_DAY, allday);
    values.put(Events.DTSTART, beginl+3600000);
    values.put(Events.ORIGINAL_INSTANCE_TIME, beginl+3600000);
values.put(Events.STATUS, Events.STATUS_CANCELED);
Uri uri = Uri.withAppendedPath(Events.CONTENT_EXCEPTION_URI,
        String.valueOf(id));
uri = asSyncAdapter(uri, account, CTS_TEST_TYPE);
Uri resultUri = context.getContentResolver().insert(uri, values);
    try {
        int eventID = Integer.parseInt(resultUri.getLastPathSegment()); 
        int debug=eventID;
        } catch (Exception e) {
        int debug=0;
        }
}
static Uri asSyncAdapter(Uri uri, String account, String accountType) {
    return uri.buildUpon()  
    .appendQueryParameter
        (android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true")
    .appendQueryParameter(Calendars.ACCOUNT_NAME, account)
    .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build();
}
</code>

Mam nadzieję, że to działa, próbowałem wyciąć części mojego kodu, które nie są istotne. Zauważysz, że muszę dodać 3600000 do wartości początkowej (1 godzina w milisekundach). Zakładam, że dzieje się tak dlatego, że w tej chwili jesteśmy w BST i ten kod nie zadziała po zmianie zegarów, ale wtedy będę się tym martwił!

Na koniec skorzystałem z aplikacji o nazwie Content Provider Helper, która pomogła mi się tego dowiedzieć. Możesz użyć tego zapytania do tabel dostawców treści. Próbowałbym skonfigurować wyjątek za pomocą mojego kodu, a następnie użyć mojej aplikacji kalendarza telefonów, aby usunąć instancję i porównać dwa rekordy.

Powiązane pytania