更改日历活动的提醒会更改活动ID,而不会更改提醒ID

时间:2013-02-23 00:19:48

标签: android android-contentprovider android-calendar

我正在尝试编写一些代码,可以判断事件的提醒是否已更改(添加或删除),但我发生了奇怪的事情。而不是删除或更改提醒,似乎正在删除并重新添加事件!我的代码不正确吗?或者这是真的发生了什么?

要测试这一点,您需要:

  1. 使用提醒创建活动

  2. 点击同步模拟器后的按钮

  3. 删除活动提醒

  4. 等到更改同步到您的模拟器,然后再次单击该按钮

  5. JAVA CODE

    package com.example.remindertest;
    
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    
    import android.app.Activity;
    import android.content.ContentResolver;
    import android.content.ContentUris;
    import android.database.Cursor;
    import android.net.Uri;
    import android.provider.CalendarContract.CalendarAlerts;
    import android.provider.CalendarContract.Events;
    import android.provider.CalendarContract.Instances;
    import android.provider.CalendarContract.Reminders;
    import android.util.Log;
    import android.view.View;
    
    public class ReminderActivity extends Activity
    {
        final static public String TAG = "ReminderActivity";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            //Add button
            setContentView(R.layout.reminder_activity);
            Log.d(TAG, "Started");
        }
    
        public void onClick(View v)
        {
            Cursor cursor = getContentResolver().query(
                Reminders.CONTENT_URI,
                null, null, null, null
            );
    
            String str = "";
    
            /*
            * Some crappy code to test this
            */
            while ( cursor.moveToNext())
            {
                int eventId = cursor.getInt(cursor.getColumnIndex(Reminders.EVENT_ID));
                Cursor eCursor = getContentResolver().query(
                    Events.CONTENT_URI,
                    new String[] { Events._ID, Events.TITLE },
                    "_id = ?", new String[] {"" + eventId}, ( String ) null);
    
                eCursor.moveToNext();
                String title = eCursor.getString(eCursor.getColumnIndex(Events.TITLE));
    
                str += eventId + " = " + title + " = " +
                    cursor.getInt(cursor.getColumnIndex(Reminders._ID)) + " = " +
                    cursor.getInt(cursor.getColumnIndex(Reminders.METHOD)) + " = " +
                    cursor.getLong(cursor.getColumnIndex(Reminders.MINUTES)) + "\n";
            }
    
            Log.d(TAG, str);
        }
    }
    

    布局XML

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:context=".ReminderActivity" >
    
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="98dp"
        android:onClick="onClick"
        android:text="Button" />
    
    </RelativeLayout>
    

    MANIFEST XML

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.remindertest"
      android:versionCode="1"
      android:versionName="1.0" >
    
    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="17" />
    
    <uses-permission android:name="android.permission.READ_CALENDAR"/>
    <uses-permission android:name="android.permission.WRITE_CALENDAR"/>
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
        android:name="com.example.remindertest.ReminderActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        </activity>
    </application>
    
    </manifest>
    

1 个答案:

答案 0 :(得分:0)

不,你的代码是正确的。在我的6台设备上完全相同 - 当您编辑它时,事件会更改它的ID(可能是重新创建)。顺便说一句,当您更改活动的时间,标题,位置或任何其他细节时,也会发生这种情况 - 而不仅仅是提醒。有趣的是,它并不总是发生 - 只是有时候。但通常2-3次编辑事件就足以模拟这种行为。

我不太清楚为什么事件会经常更改其ID,但基于此我会说,该事件的id不应该用作唯一标识符。