You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Applandeo CalendarView选中日期存入SQLite并加载?

解决Applandeo CalendarView从SQLite加载选中日期/事件的问题

我来帮你搞定从SQLite加载日期到CalendarView的问题,其实步骤很清晰,咱们一步步来:

首先,你需要先从数据库里把存储的年月日数据查出来,然后转换成Calendar对象,最后用CalendarView的API来设置选中状态或者显示事件标记。

1. 给数据库添加查询方法

首先在你的DbManager类里添加一个方法,用来获取所有存储的工作日期:

public List<DateModel> getAllWorkingDates() {
    List<DateModel> dateList = new ArrayList<>();
    SQLiteDatabase db = this.getReadableDatabase();
    // 替换成你实际的表名和字段名
    Cursor cursor = db.rawQuery("SELECT dayOfMonth, monthOfYear, year FROM working_dates", null);

    if (cursor.moveToFirst()) {
        do {
            int day = cursor.getInt(cursor.getColumnIndexOrThrow("dayOfMonth"));
            int month = cursor.getInt(cursor.getColumnIndexOrThrow("monthOfYear"));
            int year = cursor.getInt(cursor.getColumnIndexOrThrow("year"));
            dateList.add(new DateModel(day, month, year));
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();
    return dateList;
}

2. 创建DateModel封装类

用来存储从数据库查询到的年月日数据:

public class DateModel {
    private int day;
    private int month;
    private int year;

    public DateModel(int day, int month, int year) {
        this.day = day;
        this.month = month;
        this.year = year;
    }

    // Getter方法
    public int getDay() { return day; }
    public int getMonth() { return month; }
    public int getYear() { return year; }
}

3. 加载数据并设置选中日期

在你的Activity/Fragment里,调用查询方法转换数据,再设置给CalendarView:

// 初始化数据库管理器
DbManager dbManager = new DbManager(this);
List<DateModel> storedDates = dbManager.getAllWorkingDates();

// 把数据库日期转换成Calendar对象列表
List<Calendar> selectedCalendars = new ArrayList<>();
for (DateModel date : storedDates) {
    Calendar calendar = Calendar.getInstance();
    // 注意:Calendar的月份是0-based,和你存储的逻辑一致(你存的是calendar.get(Calendar.MONTH))
    calendar.set(date.getYear(), date.getMonth(), date.getDay());
    selectedCalendars.add(calendar);
}

// 让CalendarView显示选中的日期
calendarView.setSelectedDates(selectedCalendars);

4. (可选)加载事件标记

如果需要在这些日期上显示图标,把Calendar包装成EventDay再设置即可:

List<EventDay> events = new ArrayList<>();
for (DateModel date : storedDates) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(date.getYear(), date.getMonth(), date.getDay());
    events.add(new EventDay(calendar, R.drawable.sample_icon_2));
}

// 设置事件到CalendarView
calendarView.setEvents(events);

注意事项

  • 确保数据库表名和字段名和查询语句完全一致,否则会查询不到数据
  • 记得关闭Cursor和SQLiteDatabase,避免内存泄漏
  • Calendar的月份是从0开始计数的,你存储时用的是calendar.get(Calendar.MONTH),所以读取时直接设置即可,不需要加1

内容的提问来源于stack exchange,提问作者Jose Borges

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:07:44