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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:57:00