PyQt三个QListWidget关联SQLite存储看板任务保存失效问题
按日维度看板任务持久化实现方案
原有保存逻辑失效原因
你写的saveChanges方法无法正常持久化变更,核心问题有3个:
- 仅覆盖了待办列表的状态更新,完全没有处理处理中、已完成两个列表的任务状态
- 仅做了UPDATE操作:只能修改数据库中已存在的记录,用户右键新增的任务没有对应入库逻辑,被拖拽到其他列表、手动删除的任务也不会同步状态
- 写法不规范:
lista是整数字段,SQL语句里给0加单引号传字符串属于类型不匹配,虽然SQLite弱类型不会直接报错,但存在兼容隐患


单表结构正确实现
如果保留原有单表设计(字段为tarea存储任务内容、lista存储列表标识、fecha存储关联日期),最稳妥的保存逻辑是全量覆写当日数据,避免逐行更新漏判状态:
def saveChanges(self): db = sqlite3.connect("todo.db") cursor = db.cursor() selected_date = self.calendarWidget.selectedDate().toPython() # 先清空当前选中日期的所有旧任务,避免残留已删除/被拖拽走的无效数据 cursor.execute("DELETE FROM tareas WHERE fecha = ?", (selected_date,)) # 批量写入待办列表任务(标识0) for i in range(self.lista_pendientes.count()): task_content = self.lista_pendientes.item(i).text() cursor.execute( "INSERT INTO tareas (tarea, lista, fecha) VALUES (?, 0, ?)", (task_content, selected_date) ) # 批量写入处理中列表任务(标识1) for i in range(self.lista_enprogreso.count()): task_content = self.lista_enprogreso.item(i).text() cursor.execute( "INSERT INTO tareas (tarea, lista, fecha) VALUES (?, 1, ?)", (task_content, selected_date) ) # 批量写入已完成列表任务(标识2) for i in range(self.lista_completadas.count()): task_content = self.lista_completadas.item(i).text() cursor.execute( "INSERT INTO tareas (tarea, lista, fecha) VALUES (?, 2, ?)", (task_content, selected_date) ) db.commit() db.close()
触发保存的时机需要覆盖所有数据变更场景:新增任务后、拖拽任务释放后、切换日历选中日期前、关闭窗口前,避免操作丢失。
原有加载任务的updateTaskList方法不需要改动,配合上面的保存逻辑可以正常运行。
简化实现方案(提问者最终验证可用)
如果觉得维护lista字段逻辑繁琐,可以直接拆分三张独立表分别存储三类任务,不需要额外维护列表标识字段:
- 建
pendientes表存储待办任务,字段设为自增id、tarea、fecha即可 - 建
en_progreso表存储处理中任务,字段结构和待办表一致 - 建
completadas表存储已完成任务,字段结构同上
保存时只需要分别清空当日对应表的旧数据,再把对应列表的任务插入对应表即可,逻辑更直白,排查问题也更简单。
内容的提问来源于stack exchange,提问作者Antigona_curiosa
相关产品推荐
相关产品推荐

