HarmonyOS鸿蒙Next日历写入后,再次获取日历信息时,缺少identifier字段为undefined
HarmonyOS鸿蒙Next日历写入后,再次获取日历信息时,缺少identifier字段为undefined
createCourseReminderCalendarEvent(
identifier: number ,
courseName: string,
startTime: number,
endTIme: number,
reminderTime: number = 30,
description?: string,
params?: Record<string, ESObject>,
): calendarManager.Event {
if (canIUse('SystemCapability.Applications.CalendarData')) {
const event: calendarManager.Event = {
// 日程唯一标识
identifier: identifier,
// 日程标题
title: `上课提醒:【${courseName}】即将在30分钟后开课`,
// 日程类型,不推荐三方开发者使用calendarManager.EventType.IMPORTANT,重要日程类型不支持一键服务跳转功能及无法自定义提醒时间
type: calendarManager.EventType.NORMAL,
// 日程开始时间
startTime: startTime,
// 日程结束时间
endTime: endTIme,
// 距开始时间提前10分钟提醒
reminderTime: [reminderTime],
// 日程说明
description: description,
timeZone: 'Asia/Shanghai',
}
console.info(TAG, '创建的event:' + JSON.stringify(event))
return event
} else {
throw Error(TAG + `版本过低或该设备不支持使用日历相关Api`)
}
}
更多关于HarmonyOS鸿蒙Next日历写入后,再次获取日历信息时,缺少identifier字段为undefined的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者你好,这边本地设置日程、获取日程信息都是正常的,修改日程信息后也可以正常获取到identifier信息,为了进一步分析问题原因,方便的话可以提供下您这边的复现demo和设备的版本吗?
这边的本地demo如下,运行环境为6.0.0.107版本设备和6.0.0.858版本的DevEco Studio:
@Entry
@Component
struct Index {
private atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
private context = getContext() as common.UIAbilityContext;
private permissions: Array<Permissions> = [
'ohos.permission.READ_CALENDAR',
'ohos.permission.WRITE_CALENDAR',
];
private calendar: calendarManager.Calendar | undefined = undefined;
// 指定日历账户信息
private calendarAccount: calendarManager.CalendarAccount = {
name: 'MyCalendar',
type: calendarManager.CalendarType.LOCAL,
// 日历账户显示名称,该字段如果不填,创建的日历账户在界面显示为空字符串。
displayName: 'MyCalendar'
};
// 日历配置信息
private config: calendarManager.CalendarConfig = {
// 打开日程提醒
enableReminder: true,
// 设置日历账户颜色
color: '#aabbcc'
};
private identifier_id: string = ''
@State eventsInfo: string = '';
@State eventIds: number[] = []
aboutToAppear(): void {
try {
let calendarMgr = calendarManager.getCalendarManager(this.context);
// 创建日历账户
calendarMgr?.createCalendar(this.calendarAccount).then((data: calendarManager.Calendar) => {
console.info(`Succeeded in creating calendar data->${JSON.stringify(data)}`);
this.calendar = data;
// 请确保日历账户创建成功后,再进行相关日程的管理
// // 设置日历配置信息,打开日程提醒、设置日历账户颜色
this.calendar.setConfig(this.config).then(() => {
console.info(`Succeeded in setting config, data->${JSON.stringify(this.config)}`);
}).catch((err: BusinessError) => {
console.error(`Failed to set config. Code: ${err.code}, message: ${err.message}`);
});
}).catch((error: BusinessError) => {
console.error(`Failed to create calendar. Code: ${error.code}, message: ${error.message}`);
});
} catch (e) {
}
}
build() {
Column() {
Button('添加日程')
.onClick(() => {
const date = new Date();
let event =
this.createCourseReminderCalendarEvent('日程标识', '课程', date.getTime(), date.getTime() + 50 * 60 * 100,
10, '本地日程')
this.calendar?.addEvent(event, (err: BusinessError, data: number): void => {
if (err) {
console.error(`Failed to addEvent. Code: ${err.code}, message: ${err.message}`);
} else {
console.info(`Succeeded in adding event, id -> ${data}`);
this.identifier_id = data.toString();
this.eventIds.push(data);
}
});
})
Button('修改日程信息')
.onClick(() => {
const filter = calendarManager.EventFilter.filterById(this.eventIds);
this.calendar?.getEvents(filter).then((data: calendarManager.Event[]) => {
console.info(`Succeeded in getting events, data -> ${JSON.stringify(data)}`);
let newEvent = data[0]
newEvent.identifier = this.identifier_id
this.calendar?.updateEvent(newEvent, (err: BusinessError) => {
if (err) {
console.error(`Failed to update event. Code: ${err.code}, message: ${err.message}`);
} else {
console.info("Succeeded in updating event");
}
});
});
})
Button('查询当前日历下日程')
.onClick(() => {
// 根据MyEvent进行模糊查询,如果存在类似标题为MyEvent1类型的日程,也可查询出来
const filter = calendarManager.EventFilter.filterByTitle('课程');
this.calendar?.getEvents(filter, [
'id', 'type', 'title',
'location', 'startTime', 'endTime',
'isAllDay', 'attendee', 'timeZone',
'reminderTime', 'recurrenceRule', 'description',
'service',
'identifier',
'isLunar',
], (err: BusinessError, data: calendarManager.Event[]) => {
if (err) {
console.error(`Failed to get events. Code: ${err.code}, message: ${err.message}`);
} else {
console.info(`Succeeded in getting events, data -> ${JSON.stringify(data)}`);
this.eventsInfo = JSON.stringify(data)
}
});
})
Text(this.eventsInfo)
.fontSize('15fp')
.fontColor(Color.Black)
.width('100%')
.height('50%')
.align(Alignment.Center)
}
}
更多关于HarmonyOS鸿蒙Next日历写入后,再次获取日历信息时,缺少identifier字段为undefined的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
你不添加filter 试下呢,因为我这边只是想拿到全部的日程,不需要进行筛选。我这边返回的数据中identifier_id 返回值为undefined,我明天再复验下。
开发者你好,请问下您这边是什么版本的设备呢?可以使用6.0的设备再测试下,
有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html
await this.calendar?.getEvents(calendarManager.EventFilter.filterByTime(Date.now(), time), [
'id', 'type', 'title',
'location', 'startTime', 'endTime',
'isAllDay', 'attendee', 'timeZone',
'reminderTime', 'recurrenceRule', 'description',
'service',
'identifier',
'isLunar',
])
经过测试,只有添加EventFilter才能获取到identifier字段,直接使用getEvents()方法不行。
使用calendar或者calendarManager创建单个日程的时候,回调方法都会返回一个id,用这个id修改日程就行了。
主要是想把id和业务绑定,这个id没法修改,
在HarmonyOS Next中,日历写入后再次获取时缺少identifier字段为undefined,通常是因为权限配置问题或API调用时机不当。请检查是否已正确声明日历读写权限(ohos.permission.READ_CALENDAR和ohos.permission.WRITE_CALENDAR),并在获取数据前确保写入操作已完成。确认使用@ohos.calendar接口时,读取方法在写入回调成功后执行,避免异步操作导致数据未就绪。
在HarmonyOS Next中,当您使用calendarManager.Event创建日历事件后再次获取时,identifier字段返回undefined是正常行为。这是因为系统在将事件写入日历数据库时,会为事件分配一个系统内部的唯一标识符,覆盖您传入的自定义identifier值。
解决方案:
- 在创建事件后,通过insertEvent方法返回的结果获取系统分配的identifier
- 使用queryEvents接口查询时,确保传入正确的查询条件来获取完整的事件信息
- 建议在本地维护一个映射表,将您的业务identifier与系统返回的identifier关联起来
关键代码调整:
const eventId = await calendarManager.insertEvent(event);
// eventId 即为系统分配的唯一标识符
这样就能在后续查询中正确获取到包含系统分配identifier的完整事件信息。

