Java Android日历,获取事件Id

Java Android日历,获取事件Id,java,android,android-calendar,Java,Android,Android Calendar,我正在编写一个应用程序,需要在android中向日历添加一些事件。对于插入,我只使用了以下代码: public void onItemClick(AdapterView<?> adapter, View curview, int position, long id) { WhoisEntry entry = this.adapter.getItem(position); String domainName = entry.getDomainName();

我正在编写一个应用程序,需要在android中向日历添加一些事件。对于插入,我只使用了以下代码:

public void onItemClick(AdapterView<?> adapter, View curview, int position, long id) {
    WhoisEntry entry = this.adapter.getItem(position);      
    String domainName = entry.getDomainName();
    Date expDate = entry.expirationDate;
    Toast.makeText(getApplicationContext(), "Domain: " + domainName, Toast.LENGTH_SHORT).show();
    Calendar cal = Calendar.getInstance();            
    Intent intent = new Intent(Intent.ACTION_EDIT);
    intent.setType("vnd.android.cursor.item/event");
    intent.putExtra("beginTime", entry.expirationDate);
    intent.putExtra("allDay", false);       
    intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000);
    intent.putExtra("title", "Expiration of " + entry.domainName);
    startActivity(intent);
}
public-maclick(适配器视图适配器、视图曲线视图、内部位置、长id){
WhoisEntry条目=this.adapter.getItem(位置);
字符串domainName=entry.getDomainName();
Date expDate=entry.expirationDate;
Toast.makeText(getApplicationContext(),“Domain:+domainName,Toast.LENGTH_SHORT).show();
Calendar cal=Calendar.getInstance();
意向意向=新意向(意向.行动\编辑);
intent.setType(“vnd.android.cursor.item/event”);
intent.putExtra(“开始时间”,条目。到期日期);
意图。putExtra(“全天”,假);
intent.putExtra(“endTime”,cal.getTimeInMillis()+60*60*1000);
intent.putExtra(“标题”、“到期日”+条目.domainName);
星触觉(意向);
}
现在我想知道是否有可能获得与该事件相关联的id,这样在插入事件并将其id保存到我的应用程序中后,用户可以直接从应用程序内部调用该事件。
可能吗

我提取了一个列列表,用于将事件存储到android日历中。 列表如下:

[0]“原始事件”(id=830007842672)
[1] “可用性状态”(id=830007842752)
[2] “所有者帐户”(id=830007842840)
[3] “同步帐户类型”(id=830007842920)
[4] “可见性”(id=830007843008)
[5] “rrule”(id=830007843080)
[6] “lastDate”(id=830007843144)
[7] “hasAlarm”(id=830007843216)
[8] “guestsCanModify”(id=830007843288) [9] “guestsCanSeeGuests”(id=830007843376)
[10] “exrule”(id=830007843464)
[11] “rdate”(id=830007843528)
[12] “透明度”(id=830007843592)
[13] “时区”(id=830007843672)
[14] “已选择”(id=830007843744)
[15] “dtstart”(id=830007843816) [16] “标题”(id=830007843888)
[17] “同步时间”(id=830007843952)
[18] “_id”(id=830007844024) [19] “HasAttendedData”(id=830007844088) [20] “_sync_id”(id=830007844176)
[21]“commentsUri”(id=830007844248) [22]“说明”(id=830007844328) [23]“htmlUri”(id=830007844408) [24]“同步账户”(id=830007844480)
[25]“同步版本”(id=830007844560)
[26]“hasExtendedProperties”(id=830007844640)
[27]“日历id”(id=830007844736)

然后,如果我想为我的事件获取新的事件id:

public static long getNewEventId(ContentResolver cr, Uri cal_uri){      
    Uri local_uri = cal_uri;
    if(cal_uri == null){
        local_uri = Uri.parse(calendar_uri+"events");
    } 
    Cursor cursor = cr.query(local_uri, new String [] {"MAX(_id) as max_id"}, null, null, "_id");
    cursor.moveToFirst();
    long max_val = cursor.getLong(cursor.getColumnIndex("max_id"));     
    return max_val+1;
}
对于插入事件:

public void insertDomainEntry(Date exp_date, String name, long event_id){
    SQLiteDatabase db = getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("exp_date", exp_date.getTime()/1000);
    values.put("event_id", event_id);
    values.put("domainname", name);
    db.insertOrThrow("domains_events", null, values);
}
这个解决方案似乎有效,即使这可能不是一个很好的解决方案

编辑2015年2月 getNextEventId的目的是为事件表创建一个新的事件条目,下面是使用此方法的代码:

@Override
    public void onItemClick(AdapterView<?> adapter, View curview, int position,
            long id) {
        WhoisEntry entry = this.adapter.getItem(position);      
        long event_id = CalendarUtils.getNewEventId(getContentResolver(), null);

        Toast.makeText(getApplicationContext(), "Domain: " + entry.getDomainName(),
                Toast.LENGTH_SHORT).show();

        Intent intent = new Intent(Intent.ACTION_EDIT);
        intent.setType("vnd.android.cursor.item/event");
        intent.putExtra("beginTime", entry.getExpiration().getTime());
        intent.putExtra("_id", event_id);
        intent.putExtra("allDay", false);       
        intent.putExtra("endTime", entry.getExpiration().getTime()+60*30);
        intent.putExtra("title", "Expiration of " + entry.getDomainName());
        startActivity(intent);

        database.insertDomainEntry(entry.getExpiration(),
                entry.getDomainName(), event_id);
    }

插入事件后,可以轻松获取事件id

long calID = 3;
long startMillis = 0;
long endMillis = 0;
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 9, 14, 7, 30);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 9, 14, 8, 45);
endMillis = endTime.getTimeInMillis();
...

ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Events.DTSTART, startMillis);
values.put(Events.DTEND, endMillis);
values.put(Events.TITLE, "Jazzercise");
values.put(Events.DESCRIPTION, "Group workout");
values.put(Events.CALENDAR_ID, calID);
values.put(Events.EVENT_TIMEZONE, "America/Los_Angeles");
Uri uri = cr.insert(Events.CONTENT_URI, values);

// get the event ID that is the last element in the Uri
long eventID = Long.parseLong(uri.getLastPathSegment());
//
// ... do something with event ID
//
//

是否确实要将结束时间设置为当前时间?操作:D否!让我分心的是:如果你在为ICS开发DIf,那么就有了一个新的日历api;看这个。是的,我知道,但我想开发我的应用程序不仅仅是为ICS。你怎么知道最后一个事件是你的用户添加的?也许这是一个古老的事件?(用户取消)为什么我需要知道上一个事件?当我插入一个新事件时,我只需要知道我刚刚创建的id日历项,当我创建一个元素时,我也有它的id。如果你需要在另一时刻更新它们,可能最好在应用程序中保存对日历/事件项的引用(使用sqlite或其他方法)。你得到了最大值(id)因此,我假设您得到了添加到日历中的最后一个事件。但是你怎么知道用户没有取消你用startActivity(intent)打开的日历活动呢?好吧,有一段时间我没有使用这些东西,我差点忘了我做了什么。我将用解释getNextEventId含义的另一段代码更新我的答案,但简单地说,我使用getNextEventId在events表中创建事件条目,但不是真正的日历条目,它将由日历意图创建,我不记得为什么这样做:DBe小心,使用getNewEventId(max_val+1)。。考虑用户是否删除了最后一个事件。如果存在与该ID相关的x记录(即余留者或与会者),则添加具有已用ID的新事件可能会导致意外结果。
long calID = 3;
long startMillis = 0;
long endMillis = 0;
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 9, 14, 7, 30);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 9, 14, 8, 45);
endMillis = endTime.getTimeInMillis();
...

ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Events.DTSTART, startMillis);
values.put(Events.DTEND, endMillis);
values.put(Events.TITLE, "Jazzercise");
values.put(Events.DESCRIPTION, "Group workout");
values.put(Events.CALENDAR_ID, calID);
values.put(Events.EVENT_TIMEZONE, "America/Los_Angeles");
Uri uri = cr.insert(Events.CONTENT_URI, values);

// get the event ID that is the last element in the Uri
long eventID = Long.parseLong(uri.getLastPathSegment());
//
// ... do something with event ID
//
//