Flutter使用sqflite逐次插入数据时ingredientsReceipt列被覆盖而非追加的问题
问题根因
现有循环的每一轮都会执行receipt.ingredientsReceipt = 单个列表值的赋值操作,后一次赋值会完全覆盖前一次存入的内容,所以三轮循环跑完,字段里最后剩下的只有最后一轮取到的ING 3,根本没法实现拼接效果。
修改方案
方案1:循环内逐次追加内容
修改循环里的赋值逻辑,每次取当前字段已有的值,在后面拼接当前遍历的元素,同时处理字段初始为空的场景,避免字符串开头出现多余的逗号:
// 先把字段初始化为空字符串,避免拼接null导致的异常 receipt.ingredientsReceipt = ''; for (var i = 0; i < isChecked.length; i++) { if (receipt.ingredientsReceipt!.isEmpty) { // 第一次遍历直接赋值第一个元素 receipt.ingredientsReceipt = isChecked[i]; } else { // 非第一次遍历,在原有内容后加上分隔符+当前元素 receipt.ingredientsReceipt = '${receipt.ingredientsReceipt}, ${isChecked[i]}'; } print(isChecked[i]); }
方案2:更推荐的实现 一次性生成拼接结果
你的最终目标就是把整个列表拼成以, 分隔的字符串,完全不需要在循环里反复操作字符串,直接用Dart内置的join方法就能一次生成目标值,代码更短,也避免循环内反复拼接字符串带来的额外开销:
// 直接把列表转成目标格式的字符串 receipt.ingredientsReceipt = isChecked.join(', ');
容易忽略的问题
你现在查询到的结果里id: null,是因为你仅仅修改了内存中receipt对象的属性,没有真正把数据写入sqflite数据库。拼接好ingredientsReceipt的内容之后,必须显式调用数据库的写入接口,才能把数据持久化到表中:
// 插入新记录,数据库会自动给自增主键id分配整数值 await db.insert('receipt', receipt);
写入完成后再查询,就能得到和预期一致的结果:ingredientsReceipt: ING 1, ING 2, ING 3,同时id字段会有数据库自动生成的有效值。
内容的提问来源于stack exchange,提问作者Guilherme Dias
相关产品推荐
相关产品推荐

