6

電話でカレンダーのイベントをコードから更新しようとしていますが、context.getContentResolver()。updateは0を返し続けます。もちろん、カレンダーアプリでイベントを確認しても、イベントに変更はありません。

context.getContentResolver()。queryを使用してイベントIDや開始時刻などを取得しており、431、4、233などの一意の番号を取得しているため、使用しているイベントIDは本物。

これを行う公式の方法は、update()を使用する代わりにGoogleのサーバーを経由することであることを理解していますが、私の実装では、そのようにすることは意味がありません(または一般的には、私は逸脱します)。

私は何か間違ったことをしているのですか、それともAndroidが単に許可しないことをしようとしているのですか?

Uri updateEventUri = ContentUris.withAppendedId(Uri.parse("content://com.android.calendar/events"), id);

ContentValues cv = new ContentValues();
begin.set(Calendar.HOUR_OF_DAY, arg0.getCurrentHour()); //begin is a java.util.Calendar object
begin.set(Calendar.MINUTE, arg0.getCurrentMinute());
//cv.put("_id", id);
//cv.put("title", "yeahyeahyeah!");
cv.put("dtstart", begin.getTimeInMillis());
int updatedrowcount = context.getContentResolver().update(updateEventUri, cv, null, null);
System.out.println("updated "+updatedrowcount+" rows with id "+id);

関連する質問がここに投稿されましたが、返信はありませんhttps://stackoverflow.com/questions/5636350/update-android-calendar-event

何か明確にできるかどうか教えてください。私はあなたたちと人形が提供することができるどんな入力でも本当に感謝します!

4

3 に答える 3

3

私はたくさん試しましたが、最終的には解決策になりました(信頼性は低いですが)。しかし、正常に動作します。

public static boolean updateCalendar(Context context,String cal_Id,String eventId)
    {
    try{

        Uri CALENDAR_URI = Uri.parse(CAL_URI+"events");
        Cursor c = context.getContentResolver().query(CALENDAR_URI, null, null, null, null);
        String[] s = c.getColumnNames();

        if (c.moveToFirst())
        {
                while (c.moveToNext())
            {

                String _id = c.getString(c.getColumnIndex("_id"));
                String CalId = c.getString(c.getColumnIndex("calendar_id"));            
                if ((_id==null) && (CalId == null))
                {
                                 return false;
                }
                else
                {
                    if (_id.equals(eventId) && CalId.equals(cal_Id))
                                 {
                        Uri uri = ContentUris.withAppendedId(CALENDAR_URI, Integer.parseInt(_id));
                        context.getContentResolver().update(uri, null, null, null);// need to give your data here
                        return true;
                    }
                }
            }
        }


    }
    finally
    {
        return true;
    }
    }

そして最後に、それがすべてのデバイスで動作するかどうかはわかりません。

于 2011-10-10T04:28:00.563 に答える
2

さて、問題は、イベントのフェッチと編集の間に異なるURIを使用していたことでした。ここからのコードサンプルを使用し、URI「content://com.android.calendar/instances/when」を使用してイベントをフェッチして画面に表示していました。変更を加えたときは、上記の例のように「content://com.android.calendar/events」を使用してIDで編集していました。

ntcの回答のおかげで、2つのURI間のイベントのIDが異なるため、それぞれが提供する情報と一貫してイベントを編集できなかったことがわかりました。私が取得したイベントIDは、システムIDであり、電話に共通であると推測していました。

いくつかのテストを行って、どのハードウェアがこの方法と互換性がないかを確認する必要があると思います。私はテストにHTCEvoを使用していますが、これまでのところ良好です。

于 2011-10-12T04:59:05.063 に答える
0

Instancesテーブルをクエリするときは、を使用Instances.EVENT_IDして、の代わりに編集するイベントの識別子を取得しますInstances._ID

于 2013-12-30T21:01:00.593 に答える