2013-02-20 25 views
25

を削除されません。 titlestart dateイベントがすでに(重複を持ってしないように)それを追加する前に、カレンダーに存在するかどうかをチェックするためのコードを検索します。私は(カレンダーを使用して)手動でカレンダーからイベントを削除した場合、イベントはカレンダーから消え(私はすべての私のカレンダーを表示していますし、カレンダーアプリケーションでそれを見ることができない)ではなく、データベースから:私の問題は、ということです。私が理解できない別のことは、プログラムでイベントを削除しようとしたが、削除されていないということです。ここで削除イベントは、私は私のアプリがユーザーのカレンダーにリマインダーを追加しようとしています

は私のコードスニペットです:

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

はなぜイベントはカレンダーアプリケーションからそれらを削除した後になお存在していると、なぜ私も、プログラムでそれを削除することはできませんよ?

更新 問題は、挿入と削除にcalendar_id=1を使用した場合のみです。その他calendar_idはうまく動作します。

更新2 私はSamsung Galaxy S1のコードをテストして正常に動作しています。それは三星ギャラクシーS3の問題だと思う(私は問題がある、私はそれがS-プランナーアプリケーションのバグだと思う)

+0

アプリを再起動した場合、削除されたイベントはまだそれに表示されていますか? – NathanTempelman

+0

はい、私は電話を再起動しても、彼らはカレンダーアプリケーションに表示されますが、それでもContentResolverのに表示されません。クエリ() –

+0

@Mohamed_AbdAllahこれが当てはまる場合は確かに言えませんが、類似の問題はジャンルや音楽のクエリで確認できます。あなたはバグ=/ – Warpzit

答えて

17

あなたが選択文字列

AND (deleted != 1) 

に含めることを試みることができ、そのないURIの問題場合はその選択文字列は、時折

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

なり、CalendarDBはいつか取りますイベントが削除されます。しかし、 'deleted' COLUMNはすぐに削除されることを示す「1」とマークされます。 - カレンダーDBを視覚化するhttp://www.cellobject.net/Tools/CellObjectSQLiteXMLBrowser.aspxこのツールを使用してみてください:遅延の理由は多分カレンダーは

p.sを同期されるのを待っています。

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

それは、すべてのデバイス上で動作します:あなたはまた、このような何かを行うことができ

+1

Galaxy S3のS-planner Appには、あなたが言及したように削除されたイベントが決して削除されないので、まだバグがあります。あなたのコードはクエリの結果から削除されたイベントをフィルタリングするのに役立ちますが、私は自分の電話をOn&Offに切り替え、多くの時間待っていて、イベントはContentProvider DBに残っています。 –

+0

イベントが削除されたカレンダー(ExchangeアカウントやGoogleアカウントなど)との同期がありますか。その場合は、同期して削除するまでに時間がかかります。 –

+1

私は2ヶ月前からこの問題に直面していました.2ヶ月前に追加したデータは(削除された状態で)まだ存在しています。私はそれが時間の問題だとは思わない。 –

1

異なるバージョンのアンドロイドは、カレンダーデータを検索するために異なるURIパスを使用します。別の方法が好適である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"; 

:たとえば、あなたはアンドロイド2.1と2.2のために以下の定数を使用することができ

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

は良いチャンスがあることをギャラクシーS3少なくともAndroid 4.0を搭載しています。この変更は、S1ではなくS3で動作するコードの原因となる可能性があります。

+1

これはURIの問題ではありません。私は既にa/m URIを使用してデータを見つけましたが、S-Plannerから削除された場合でもCursorで表示されます。 URIを変更しようとしましたが、同じ出力が得られます。 –

+0

私は、あなたが> = 4.0でなく、新しいAPIを使用していない場合、Googleが幸運を言っているとすれば、あなたのコードはある時点で破損する可能性があると私のポイントの1つは思います。それがあなたをあまり助けてくれないことは分かっていますが、それは彼らの公式な声明です。 – Shellum

+1

ご協力いただきありがとうございますが、SDKごとのURIを指定するなど、ほとんどすべてを試しました。 –

0

デシベルで「削除」と「汚い」列をチェックしてください。

関連する問題