c语言日历系统的设计与部分实现
c语言实现日历系统,sqlite保存数据库,发现问题不少,特别是数据库的设计,另外,c语言的字符拼接问题也很蛋疼,问题起源如下:
起源:在日历中有个功能就是可以设置重复的事件,比如我在日历中加入一个
事件,然后可以设置这个事件按天,或者按星期,或者按月,或者按年重复提醒。
如果每个事件都是一条记录的话,肯定不可行,会导致过多的记录。但如果
是所有重复事件加个标志位使它成为一条记录的话也有个问题。就是需求中在
这一系列重复事件中我可以单独改一个事件而不影响其他事件。举个例子,我建一个事件,然后指定
这个事件在2008年12月份中的每天的12点,那我在日历中12月的每一天都可以看到这个
事件,然后我可以单独修改12月22日的事件而不影响其他的事件。这样肯定不能用一条记录。
想请教下数据库该如何设计,可以参考google日历的事件重复功能,功能差不多
解决方案:
分析如下:
1、你设计的不是闹钟,所以预订时间是没什么作用的,只是一个显示属性而已。
2、按天实际上就是按星期或者按月。。。,只是发生的日期点是“周1、周2。。。、周日”
3、实际有效的设定是按周、按月、按年。
4、日历上的每天都要按上面的周期得到属性值,比如今天是“周日”、“28日”、“12月28日”
设计如下:
1、t_memo 备忘录主表:
id int 主键
userid int 表示属于哪个用户
begindate date 起始日期(设定开始日期)
enddate date 结束日期(如果为空表示一直有效,不过为了编程方便,最好是放入一个非常大的日期,比如2099年12月31日)
memomessage varchar 备忘录内容
alarmtime time 闹钟时间
type int (1表示按周、2表示按月、3表示按年。。。)
2、t_schedule 定时表
id int 主键
memoid int 外键关联备忘录主表的主键
validdate varchar 有效日期(按周就存入1/2/3/.../7,按月就1/2/....31/,按年就存入0101/0102/....1231)
编程(以月历方式):
从当月1号开始,计算每天的周值、月值、年值(要跟定时表的validdate匹配)
到数据库中查找满足条件的memomessage,SQL可能会是:
select m.* from t_memo m,t_schedule s
where m.id=s.memoid and begindate<=:today and enddate>=:today
and ((m.type=1 and s.validdate=:weekvalue) or (m.type=2 and s.validdate=:monthvalue) or (m.type=3 and s.validdate=:yearvalue))
本人采用c语言进行实现,只采用了一张表,简化了主从表查询,也达到了类似的效果
表设计如下:
create table if not exists mytimetable(id integer primary key autoincrement,startTime datetime,endTime datetime,alarmtime datetime,eventDes varchar(128),repeatOption int,validdate varchar(256))"