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的完整事件信息。
 
        
       
                   
                   
                  

