You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将List对象存入sqflite并读取?存储时遇类型转换异常

解决sqflite插入List数据时的类型转换异常

看起来你遇到的问题有两个核心原因,咱们一步步来解决:

问题分析

从错误信息 DatabaseException(java.lang.String cannot be cast to java.lang.Integer) 和参数 [RMA/04925, [10304, SMEG CARE]] 能看出来:

  1. 数据库字段名不匹配:你的表结构里定义的是 partnerId 字段,但插入SQL里用的是 partner_id,两者不一致会导致数据映射错误;
  2. List类型无法直接存入TEXT字段:sqflite没有原生支持List类型存储,直接把List<dynamic>插入TEXT字段会触发类型转换异常。

具体修复步骤

1. 统一数据库字段名

先把表创建语句里的字段名和模型类的键名统一,改成和接口返回一致的partner_id:

_onCreate(Database db, int version) async {
  await db.execute("CREATE TABLE $TABLE (name TEXT PRIMARY KEY, partner_id TEXT)");
}

2. 修改模型类,处理List与JSON字符串的转换

因为SQLite只能存基础类型,我们需要把partnerId这个List转成JSON字符串存储,读取时再解析回List:

import 'dart:convert'; // 别忘了导入这个包

class Order {
  String name;
  List<dynamic> partnerId;

  Order({this.name, this.partnerId});

  Order.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    // 从数据库读取的JSON字符串解析为List
    partnerId = json['partner_id'] != null 
        ? List<dynamic>.from(jsonDecode(json['partner_id'])) 
        : [];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['name'] = this.name;
    // 把List转成JSON字符串存入数据库
    data['partner_id'] = this.partnerId != null 
        ? jsonEncode(this.partnerId) 
        : jsonEncode([]);
    return data;
  }
}

3. 验证其他代码

你的save方法和获取数据的逻辑不需要大改,现在toJson()返回的partner_id是字符串类型,完全符合数据库TEXT字段的要求,插入时就不会再触发类型转换异常了。

为什么这样改?

  • 字段名统一后,sqflite能正确映射数据到对应的字段,避免字段不匹配的隐性错误;
  • JSON字符串是SQLite支持的TEXT类型,把List转成JSON字符串既保留了数据结构,又能顺利存入数据库,读取时解析回来就能还原原来的List结构。

内容的提问来源于stack exchange,提问作者Elliot Xin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:32:43