如何将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
相关产品推荐
相关产品推荐

