首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含映射的SQFLite (颤振)插入失败

包含映射的SQFLite (颤振)插入失败
EN

Stack Overflow用户
提问于 2020-03-03 06:40:56
回答 2查看 4.3K关注 0票数 1

有人能确认SQFLite是否支持包含地图的地图吗?我确实在这个网站上看到了下面的帖子,这可能就是答案?

Flutter sqflite insert List

在我的情况下,我有两个模型类,我正在工作。

  • House
  • Dog

House包括一个称为“宠物”的字段,它是一个列表。

我在每个类中都有一个构造函数和工厂方法,它负责根据需要将映射/对象转换为/从映射/对象,以便从SQFLite发送和检索信息。

模型类狗

代码语言:javascript
复制
class Dog {
  final int id;
  final String breed;
  final String name;
  final int age;

  Dog({this.id, this.breed, this.name, this.age});

  // Used when inserting a row into the db, including the id field
  Map<String, dynamic> toMap() {
    final map = Map<String, dynamic>();
    map['id'] = id;
    map['breed'] = breed;
    map['name'] = name;
    map['age'] = age;
    return map;
  }

  // Used when returning a row from the DB and converting into an object
  factory Dog.fromMap(Map<String, dynamic> data) => Dog(
      id: data['id'],
      breed: data['breed'],
      name: data['name'],
      age: data['age']
  );
}

房屋

代码语言:javascript
复制
import 'dog.dart';

class House{
  final int id;
  final String name;
  final String color;
  final List<Dog> pets;

  House({this.id, this.name, this.color, this.pets});

  // Will be used when inserting a row into the database
  Map<String, dynamic> toMap() {
    final map = Map<String, dynamic>();
    map['id'] = id;
    map['name'] = name;
    map['color'] = color;
    if (this.pets != null) {
      map['pets'] = this.pets.map((pet) => pet.toMap()).toList();
    }
    return map;
  }

  // Used when returning a row from the DB and converting into an object
  factory House.fromMap(Map<String, dynamic> data) {
    return House(
      id: data['id'],
      name: data['name'],
      color: data['color'],
      pets: data['pets'] != null
          ? (data['pets'] as List).map((pet) => Dog.fromMap(pet)).toList()
          : null,
    );
  }
}

插入新房子的方法

代码语言:javascript
复制
Future<int> addNewHome(House house) async {
    // Attempt to add the house to the DB
    var client = await database.db;
    int result = await client.insert(HomesSchema.tblHomes, house.toMap(), conflictAlgorithm: ConflictAlgorithm.replace);
    _homes.add(house);
    return result;
  }

当我尝试执行插入时,我会得到以下错误。

代码语言:javascript
复制
E/flutter (  586): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: DatabaseException(java.util.HashMap cannot be cast to java.lang.Integer) sql 'INSERT OR REPLACE  INTO homes (id, name, color, pets) VALUES (?, ?, ?, ?)' args [1, Smith, Green, [{name: Mackie, id: 1, breed: Rottweiler, age: 8}, {name: Tanner, id: 2, breed: Mastiff, age: 8}]]}
E/flutter (  586): #0      wrapDatabaseException (package:sqflite/src/exception_impl.dart:12:7)
E/flutter (  586): <asynchronous suspension>
E/flutter (  586): #1      SqfliteDatabaseFactoryImpl.wrapDatabaseException (package:sqflite/src/factory_impl.dart:25:7)
E/flutter (  586): #2      SqfliteDatabaseMixin.safeInvokeMethod (package:sqflite/src/database_mixin.dart:188:15)
E/flutter (  586): #3      SqfliteDatabaseMixin.txnRawInsert.<anonymous closure> (package:sqflite/src/database_mixin.dart:363:14)
E/flutter (  586): #4      SqfliteDatabaseMixin.txnSynchronized.<anonymous closure> (package:sqflite/src/database_mixin.dart:307:22)
E/flutter (  586): #5      BasicLock.synchronized (package:synchronized/src/basic_lock.dart:32:26)
E/flutter (  586): #6      SqfliteDatabaseMixin.txnSynchronized (package:sqflite/src/database_mixin.dart:303:43)
E/flutter (  586): #7      SqfliteDatabaseMixin.txnWriteSynchronized (package:sqflite/src/database_mixin.dart:325:7)
E/flutter (  586): #8      SqfliteDatabaseMixin.txnRawInsert (package:sqflite/src/database_mixin.dart:362:12)
E/flutter (  586): #9      SqfliteDatabaseExecutorMixin.rawInsert (package:sqflite/src/database_mixin.dart:49:15)
E/flutter (  586): #10     SqfliteDatabaseExecutorMixin.insert (package:sqflite/src/database_mixin.dart:59:12)
E/flutter (  586): #11     Homes.addNewHome (package:search_list_view/providers/homes.dart:19:31)
E/flutter (  586): <asynchronous suspension>
E/flutter (  586): #12     _MyAppState.build.<anonymous closure> (package:search_list_view/main.dart:95:26)
E/flutter (  586): #13     _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:706:14)
E/flutter (  586): #14     _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:789:36)
E/flutter (  586): #15     GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
E/flutter (  586): #16     TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:486:11)
E/flutter (  586): #17     BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:264:5)
E/flutter (  586): #18     BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:199:7)
E/flutter (  586): #19     PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:467:9)
E/flutter (  586): #20     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:76:12)
E/flutter (  586): #21     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:117:9)
E/flutter (  586): #22     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:379:8)
E/flutter (  586): #23     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:115:18)
E/flutter (  586): #24     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:7)
E/flutter (  586): #25     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:218:19)
E/flutter (  586): #26     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:198:22)
E/flutter (  586): #27     GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
E/flutter (  586): #28     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)
E/flutter (  586): #29     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
E/flutter (  586): #30     _rootRunUnary (dart:async/zone.dart:1138:13)
E/flutter (  586): #31     _CustomZone.runUnary (dart:async/zone.dart:1031:19)
E/flutter (  586): #32     _CustomZone.runUnaryGuarded (dart:async/zone.dart:933:7)
E/flutter (  586): #33     _invoke1 (dart:ui/hooks.dart:273:10)
E/flutter (  586): #34     _dispatchPointerDataPacket (dart:ui/hooks.dart:182:5)
E/flutter (  586): 

如果答案是更改我的DB模式,以便我有一个连接狗和房子的表,然后执行一个自定义查询来提取我想要的信息,那么好的,我将这样做。nosql db应该能够处理这个问题,这似乎不太可能.是/不是?

如能提供任何援助,将不胜感激。

谢谢你,鲍勃

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-03 11:29:40

为了在SQLite数据库中存储任何类型的值,您可以简单地将对象序列化为JSON,然后反序列化对象。假设您有一个名为菜单的类。(我在这里使用可序列化的JSON )

代码语言:javascript
复制
   class Menu {

   @JsonKey(name: "status")
   String status;
   @JsonKey(name: "data")
   MenuListData menuListData;

   Menu(this.status, this.menuListData);
   factory Menu.fromJson(Map<String,dynamic> 
   json)=>_$MenuFromJson(json);
   Map<String, dynamic> toJson() => _$MenuToJson(this);

 }

下面是如何将其编码到JSON中,并将其存储(在您的集团中)。

代码语言:javascript
复制
   Menue menuList =
    await getIt<LiveMenuRepository>().getMenuResponse(menuPost);

    //decode the response to String format
    String menuResponseString = jsonEncode(menuList);

    //convert the string to Map of <String,dynamic> format

    Map<String, dynamic> menuResponseMap = {"menu": menuResponseString};

    //store this Map response in to local database
    int menuStored = await getIt<LocalMenuRepository>().insertMenuResponseData(menuResponseMap);

您的DB插入方法

代码语言:javascript
复制
Future<int> insertMenuResponseData(Map<String,dynamic> menuResponse) async {
final db = await dbProvider.database;
var result = db.insert(menuTable, menuResponse);
return result;
}

稍后使用以下方法检索对象

代码语言:javascript
复制
final Map<String, dynamic> menuList = await getIt<LocalMenuRepository>().getMenuResponseString();
  //  if(menuList!=null) {
      menuList.forEach((key, value) {
        if (key == "menu") {
          storedMenu = value ;
        }
      });
      //decode the string back to Map Object
      final dynamic menuMap = jsonDecode(storedMenu);

      //getting the Menu object using fromJson method

      final Menu menuListNameResponse = Menu
          .fromJson(menuMap as Map<String,dynamic>);

//getMenuResponseString方法( db )

代码语言:javascript
复制
Future<Map<String,dynamic>> getMenuResponse() async {
final db = await dbProvider.database;

List<Map<String, dynamic>> result;

result = await db.rawQuery('SELECT * FROM $menuTable');
// print(result[0]);

if (result.length > 0) {

  return result[0];
}
return null;
}
票数 2
EN

Stack Overflow用户

发布于 2020-03-03 07:18:56

这里列出了受支持的类型(num、String或Uint8List):https://github.com/tekartik/sqflite/blob/master/sqflite/doc/supported_types.md

嵌套内容不受支持,Map和List应该以受支持的类型(例如json字符串)编码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60501415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档