Flutter中如何创建模型并将数组非JSON格式存入SQLite
适配SQLite存储数组属性的实现方案
参考JSON示例结构:
1. 数据表设计(一对多关联)
关系型数据库本身不支持数组类型原生存储,采用主表+关联子表的结构拆分数据即可实现需求:
- 主表存储业务对象的单值属性,设置唯一主键
- 子表专门存储数组内的单个元素,新增外键字段关联主表主键,确保数据对应关系
2. 数据模型适配逻辑
模型层做拆分和拼装的适配,对外暴露完整的数组属性,内部处理和数据库的交互逻辑:
- 存储时:先插入主表数据拿到主键,再将数组内的所有元素批量插入到子表,关联主表主键
- 查询时:先查主表基础数据,再通过主键关联查询子表的所有对应元素,拼装成数组后赋值给模型对应属性
3. 核心代码示例(基于sqflite包)
建表语句
// 初始化数据库时执行建表逻辑 Future<void> _onCreate(Database db, int version) async { // 主表示例:存储用户基础信息 await db.execute(''' CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, phone TEXT ) '''); // 子表示例:存储用户的爱好数组元素 await db.execute(''' CREATE TABLE user_hobbies ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, hobby_content TEXT NOT NULL, FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE ) '''); }
存储逻辑
Future<int> saveUser(UserModel user) async { final db = await database; // 插入主表数据,获取生成的主键id int userId = await db.insert('users', user.toBaseMap()); // 批量插入数组元素到子表 List<Map<String, dynamic>> hobbyMaps = user.hobbies.map((hobby) { return { 'user_id': userId, 'hobby_content': hobby, }; }).toList(); for (var map in hobbyMaps) { await db.insert('user_hobbies', map); } return userId; }
查询逻辑
Future<UserModel?> getUserById(int userId) async { final db = await database; // 查询主表基础数据 List<Map<String, dynamic>> userRes = await db.query( 'users', where: 'id = ?', whereArgs: [userId], ); if (userRes.isEmpty) return null; // 查询关联的数组元素 List<Map<String, dynamic>> hobbyRes = await db.query( 'user_hobbies', where: 'user_id = ?', whereArgs: [userId], ); List<String> hobbies = hobbyRes.map((e) => e['hobby_content'] as String).toList(); // 拼装完整模型 return UserModel.fromMap(userRes.first, hobbies); }
拓展说明
如果数组内存储的是自定义对象而非基础类型,只需要在子表新增对应自定义对象的属性字段即可,整体逻辑无需调整。
内容的提问来源于stack exchange,提问作者shan michael smith
相关产品推荐
相关产品推荐


