0

私のアプリでは、画面上のGoogleカレンダーにイベントを追加しています。ユーザーが再び画面に来ると、イベントを再度追加して、カレンダーに重複イベントも表示されます。 新しいイベントを追加する前に、そのイベントが既に存在するかどうか確認したいと思います。私は、カレンダーのすべてのイベントを取得し、それを反復処理する場合は、私のアプリは非常に遅くなったり、通知をハングアンドロイドカレンダーで自分のアプリで追加したイベントを取得します。

too many calendar deletes 

私は値を挿入するために使用していたコードは次のとおりです。

final ContentValues event = new ContentValues(); 


    event.put(CalendarContract.Events.CALENDAR_ID, calendarId); 

    event.put(CalendarContract.Events.TITLE, name); 
    event.put(CalendarContract.Events.DTSTART, millisstarttime); 
    event.put(CalendarContract.Events.DTEND, millisendtime); 
    event.put(CalendarContract.Events.EVENT_LOCATION, venue); 
    event.put(CalendarContract.Events.ALL_DAY, 0); // 0 for false, 1 for true 
    event.put(CalendarContract.Events.HAS_ALARM, 1); 
    event.put(CalendarContract.Events.ACCESS_LEVEL, CalendarContract.Events.ACCESS_PRIVATE); 
    event.put(CalendarContract.Events.AVAILABILITY, CalendarContract.Events.AVAILABILITY_BUSY);// 0 for false, 1 for true 

    String timeZone = TimeZone.getDefault().getID(); 
    event.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone); 

    this.getContentResolver().insert(baseUri, event); 

そして、私は値を取得しようとしています:

private void deleteeve(ContentResolver cr,int calendarId) { 

    String[] projection = {CalendarContract.Events._ID, 
      CalendarContract.Events.CUSTOM_APP_PACKAGE,CalendarContract.Events.CALENDAR_ID,CalendarContract.Events.ORGANIZER}; 
    // Get a Cursor over the Events Provider. 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) { 
     // TODO: Consider calling 
     return; 
    } 
    Cursor cursor = getContentResolver().query(
      CalendarContract.Events.CONTENT_URI, projection,"calendar_id=" + calendarId, null, 
      null); 
    assert cursor != null; 
    cursor.moveToFirst(); 

    String idsToDelete = ""; 
    int nameIdx = cursor.getColumnIndexOrThrow(CalendarContract.Events.CUSTOM_APP_PACKAGE); 
    int id=cursor.getColumnIndexOrThrow(CalendarContract.Events._ID); 
    int org=cursor.getColumnIndexOrThrow(CalendarContract.Events.ORGANIZER); 
    while (cursor.moveToNext()) { 
     // Extract the name. 
     String name = cursor.getString(nameIdx); 
     String apppackage = getApplicationContext().getPackageName(); 
     String organizer=cursor.getString(org); 
     String idevent = cursor.getString(id); 
     for (int i = 0; i < cursor.getCount(); i++) { 

      if (apppackage.equals(name)) { 
       // MY CODE 
      } 

     } 
    } 

} 

私は、パッケージ名を使用してイベントを取得しようとした、だから、イベントは私のアプリで追加取得するためにとにかく、すべてのイベントを反復以外、ありますか?

+0

どのカレンダーを使用しますか? –

+0

@JohnKalimeris私のGoogleアカウントのカレンダーIDです。 –

+0

アプリの新しいローカルカレンダーを作成し、イベントを保存することができます。このカレンダーからのすべてのイベントを照会することができます。あなたが望むなら、私はあなたにいくつかのコードを提供することができます。 –

答えて

0

私はそれを自分で修正しました。 私はすべてが正しいと思っていた。メインスレッドで200のイベントを削除しようとしていたため、ハングアップしていました。 私がしたことは、sepatateスレッドでイベントの削除と保存を開始したことだけでした。

Thread mThread = new Thread(new Runnable(){ 
@override 
public void run(){ 
    //MY stuff 
} 

}); 

これはすべてです。

0

あなたのアプリの新しいカレンダーを作成したくない場合は、これを試すことができます。

Cursor cursor = getContentResolver().query(
     CalendarContract.Events.CONTENT_URI, projection, CalendarContract.Events.CUSTOM_APP_PACKAGE = getApplicationContext().getPackageName(), null, 
     null); 
関連する問題