Flutter笔记应用使用sqflite时如何将标题和内容传给insert方法
问题原因
你定义的DatabaseHelper.insert方法仅接收1个Note类型的参数,调用时直接传入了title、body两个字符串,参数数量和类型都不匹配,所以触发报错。
解决方案
按以下步骤修改即可:
- 调整
Note模型类适配自增ID逻辑
你的ID是数据库自动生成的,新建笔记时不需要手动传ID,修改模型类支持ID可空:
import 'db_operations.dart'; class Note { // 改为可空类型,新建笔记时ID留空由数据库生成 int? id; String title; String body; // 调整构造函数,ID可选,标题和内容必填 Note({this.id, required this.title, required this.body}); Note.fromMap(Map<String, dynamic> map) { id = map['id']; title = map['title']; body = map['body']; } Map<String, dynamic> toMap(){ return { DatabaseHelper.columnId : id, DatabaseHelper.columnTitle : title, DatabaseHelper.columnBody : body }; } }
- 优化
DatabaseHelper的insert方法(可选,减少冗余代码)
你已经在Note类中实现了toMap方法,直接调用即可,不需要手动拼写键值对:
Future<int> insert(Note note) async { Database db = await instance.database; return await db.insert(table, note.toMap()); }
- 修改插入调用逻辑
把获取到的标题和内容封装为Note对象后再传入insert方法,同时调整跳转时机,等插入完成后再跳页避免数据没同步:
ActionsIconButton( icon: Icon(save, color: black), callBack: () async { debugPrint(bodyController.text); debugPrint(headerController.text); String title = headerController.text; String body = bodyController.text; // 封装为Note对象 Note newNote = Note(title: title, body: body); // 等待插入完成 await dbHelper.insert(newNote); // 插入完成后再跳转,加mounted判断避免页面销毁时报错 if(mounted) { getHeaderDataToMainScreen(context); } }, )
如果不想修改Note类的原有构造函数,也可以在创建Note对象时给ID传0值,数据库自增逻辑会自动覆盖传入的ID,修改调用代码为:
Note newNote = Note(0, title, body); await dbHelper.insert(newNote);
内容的提问来源于stack exchange,提问作者ghost deathrider
相关产品推荐
相关产品推荐

