Flutter中Google Maps数据存SQFLite的模型类toMap方法如何编写
实现方案说明
SQFLite仅支持null、int、double、String、Uint8List五种基础类型存储,自定义嵌套对象无法直接存入,以下提供两种适配方案:
方案1:扁平化字段存储(推荐)
将嵌套的经纬度拆为独立数据库字段,可直接对经纬度做SQL查询,性能更高。
各模型补充方法代码
import 'dart:convert'; class LocationModel { final double latitude; final double longitude; LocationModel({required this.latitude, required this.longitude}); factory LocationModel.fromJson(Map<dynamic, dynamic> parsedJson) { return LocationModel(latitude: parsedJson['lat'], longitude: parsedJson['lng']); } // 新增toMap方法 Map<String, dynamic> toMap() { return { 'lat': latitude, 'lng': longitude, }; } } class GeometryModel { final LocationModel locationModel; GeometryModel({required this.locationModel}); factory GeometryModel.fromJson(Map<dynamic, dynamic> parsedJson) { return GeometryModel(locationModel: LocationModel.fromJson(parsedJson['location'])); } // 新增toMap方法 Map<String, dynamic> toMap() { return locationModel.toMap(); } } class PlaceModel { final String placeId; final GeometryModel geometryModel; final String address; final String name; // 可选:新增字段存储完整原始JSON响应 final String? rawJson; PlaceModel({ required this.placeId, required this.geometryModel, required this.address, required this.name, this.rawJson, }); factory PlaceModel.fromJson(Map<String, dynamic> parsedJson) { return PlaceModel( placeId: parsedJson['place_id'], name: parsedJson['vicinity'], geometryModel: GeometryModel.fromJson(parsedJson['geometry']), address: parsedJson['formatted_address'], // 若需要存储原始响应,传入jsonEncode(parsedJson)即可 rawJson: jsonEncode(parsedJson), ); } // 新增toMap适配SQFLite存储 Map<String, dynamic> toMap() { return { 'place_id': placeId, 'name': name, 'address': address, 'lat': geometryModel.locationModel.latitude, 'lng': geometryModel.locationModel.longitude, // 可选:存储原始JSON字段 'raw_json': rawJson, }; } // 新增fromMap,从数据库读取数据时转为模型对象 factory PlaceModel.fromMap(Map<String, dynamic> map) { return PlaceModel( placeId: map['place_id'] as String, name: map['name'] as String, address: map['address'] as String, geometryModel: GeometryModel( locationModel: LocationModel( latitude: map['lat'] as double, longitude: map['lng'] as double, ), ), rawJson: map['raw_json'] as String?, ); } }
对应建表SQL
CREATE TABLE places ( place_id TEXT PRIMARY KEY, name TEXT NOT NULL, address TEXT NOT NULL, lat REAL NOT NULL, lng REAL NOT NULL, raw_json TEXT );
方案2:嵌套结构转JSON字符串存储
不需要拆分层级,保留完整嵌套结构,适合不需要单独查询经纬度的场景。
仅需修改PlaceModel的toMap和fromMap即可:
// 适配存储的toMap方法 Map<String, dynamic> toMap() { return { 'place_id': placeId, 'name': name, 'address': address, 'geometry_str': jsonEncode(geometryModel.toMap()), 'raw_json': rawJson, }; } // 读取数据的fromMap方法 factory PlaceModel.fromMap(Map<String, dynamic> map) { return PlaceModel( placeId: map['place_id'] as String, name: map['name'] as String, address: map['address'] as String, geometryModel: GeometryModel.fromJson(jsonDecode(map['geometry_str'])), rawJson: map['raw_json'] as String?, ); }
内容的提问来源于stack exchange,提问作者NaanAvanAlla
相关产品推荐
相关产品推荐

