5

Android 2.3 Phone のカレンダーから定期的なイベントのインスタンスを 1 つだけ削除する方法について、さまざまな投稿を調べてきましたが、完璧な答えを見つけることができませんでした。これまでのところ、私が遭遇した最高のものは次のとおりです。

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

id2 は、削除するイベントの ID です。私が抱えている問題は、定期的なイベントのインスタンスを 1 つだけ削除したいのですが、このコードはすべてのイベントを削除することです。インスタンスを 1 つだけ削除する方法はありますか? ありがとう。

4

3 に答える 3

6

他の誰かがまだこれに苦労しているなら、私はついにそれを解決しました!

レコードを削除または修正していないことがわかります。実際に行うことは、例外と呼ばれる新しいイベントを挿入することです。この情報をどこかで見つけるのに数か月かかり、それを見つけたとしても、それを機能させるために例外に何を入れる必要があるかを正確に理解するのにさらに数か月かかりました.

まず、1 回の発生をキャンセルするイベントの実際のインスタンスをクエリします。CalendarContract.Instances.TITLE、CalendarContract.Instances.BEGIN、および CalendarContract.Instances.EVENT_ID の値を取得するには、CalendarContract.Instances テーブルにクエリを実行する必要があります。私のコードでこれを行う方法は、この回答のコンテキストに実際には適合しないため、うまくいけば、自分でそれを行う方法を考え出すことができます. これらの値を次のように保存します。

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

次に、次のように新しいイベントを設定する必要があります。

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

これが機能することを願っています。関連しないコードの部分を切り取ろうとしました。beginl 値 (ミリ秒単位で 1 時間) に 3600000 を追加する必要があることに気付くでしょう。これは、現在 BST にいて、クロックが変わるとこのコードが機能しないためだと思いますが、そのときは心配します!

最後に、Content Provider Helper というアプリを使用して、これを見つけました。これを使用して、コンテンツ プロバイダー テーブルにクエリを実行できます。コードを使用して例外を設定してから、携帯電話のカレンダー アプリを使用してインスタンスを削除し、2 つのレコードを比較します。

于 2014-08-17T08:15:28.860 に答える
6

Here are the basics

  1. Find the instance you want to delete. (using Instances.query())
  2. Create the exception URI with the event ID appended.
  3. Create ContentValues. Put your instance's BEGIN value as ...Events.ORIGINAL_INSTANCE_TIME. Put STATUS_CANCELED as ...Events.STATUS
  4. Now only insert(yourURI, yourValues) and that's it!
于 2015-03-12T10:33:48.497 に答える
1

元のイベントのEXDATE列を更新する必要があります。

于 2013-03-03T11:24:55.757 に答える