【问题标题】:how to store api json data into sqflite in flutter如何在flutter中将api json数据存储到sqflite
【发布时间】:2020-04-13 12:25:20
【问题描述】:

我正在尝试将 api 数据存储在 sqflite 中,但得到“发生异常。 _CastError(类型 'String' 不是类型转换中类型 'List' 的子类型)”。请帮我解决这个问题。

这是为了获取api数据。(employee_api_provider.dart)

//import 'package:flutter/cupertino.dart';
import 'package:flutter_app/src/models/employee_model.dart';
import 'package:flutter_app/src/providers/db_provider.dart';
import 'package:dio/dio.dart';

class EmployeeApiProvider {
  Future<List<Employee>> getAllEmployees() async {
    var url = "url";
    Response response = await Dio().get(url);
    //debugPrint(response);

    return (response.data as List).map((employee) {
      print('Inserting $employee');
      DBProvider.db.createEmployee(Employee.fromJson(employee));
    }).toList();
  }
}

我已经创建了模型类(employee_model.dart)

 import 'dart:convert';

    List<Employee> employeeFromJson(String str) =>
        List<Employee>.from(json.decode(str).map((x) => Employee.fromJson(x)));

    String employeeToJson(List<Employee> data) =>
        json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

    class Employee {
      int id;
      int eventId;
      String menuName;
      String menuIcon;
      String deepLinkName;
      int displayStatus;
      int orderId;
      String dateTime;

      Employee({
        this.id,
        this.eventId,
        this.menuName,
        this.menuIcon,
        this.deepLinkName,
        this.displayStatus,
        this.orderId,
        this.dateTime,
      });

      factory Employee.fromJson(Map<String, dynamic> json) => Employee(
            id: json["Id"],
            eventId: json["Event_Id"],
            menuName: json["Menu_Name"],
            menuIcon: json["Menu_Icon"],
            deepLinkName: json["Deep_Link_Name"],
            displayStatus: json["Display_Status"],
            orderId: json["Order_Id"],
            dateTime: json["Date_Time"],
          );

      Map<String, dynamic> toJson() => {
            "Id": id,
            "Event_Id": eventId,
            "Menu_Name": menuName,
            "Menu_Icon": menuIcon,
            "Deep_Link_Name": deepLinkName,
            "Display_Status": displayStatus,
            "Order_Id": orderId,
            "Date_Time": dateTime,
          };
    }

db_provider.dart

import 'dart:io';
import 'package:flutter_app/src/models/employee_model.dart';
import 'package:path/path.dart';

import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';

class DBProvider {
  static Database _database;
  static final DBProvider db = DBProvider._();

  DBProvider._();

  Future<Database> get database async {
    // If database exists, return database
    if (_database != null) return _database;

    // If database don't exists, create one
    _database = await initDB();

    return _database;
  }

  // Create the database and the Employee table
  initDB() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    final path = join(documentsDirectory.path, 'menu.db');

    return await openDatabase(path, version: 1, onOpen: (db) {},
        onCreate: (Database db, int version) async {
      await db.execute('CREATE TABLE Employee('
          'id INTEGER,'
          'eventId INTEGER,'
          'menuName TEXT,'
          'menuIcon TEXT,'
          'deepLinkName TEXT,'
          'displayStatus INTEGER,'
          'orderId INTEGER,'
          'DateTime TEXT'
          ')');
    });
  }

  // Insert employee on database
  createEmployee(Employee newEmployee) async {
    await deleteAllEmployees();
    final db = await database;
    final res = await db.insert('Employee', newEmployee.toJson());

    return res;
  }

  // Delete all employees
  Future<int> deleteAllEmployees() async {
    final db = await database;
    final res = await db.rawDelete('DELETE FROM Employee');

    return res;
  }

  Future<List<Employee>> getAllEmployees() async {
    final db = await database;
    final res = await db.rawQuery("SELECT * FROM EMPLOYEE");

    List<Employee> list =
        res.isNotEmpty ? res.map((c) => Employee.fromJson(c)).toList() : [];

    return list;
  }
}

db_provider.dart

【问题讨论】:

  • 如果可能的话,你可以添加完整的堆栈跟踪
  • @VijayaRagavan 我已经添加了完整的代码。请检查。我在employee_api_provider.dart('return(response.data as List).map((employee){)中遇到错误。请检查

标签: flutter


【解决方案1】:

请使用这个flutter插件json_store

【讨论】:

    【解决方案2】:

    employee_api_provider.dart中使用它

    return employeeFromJson(response.data).map((employee) {
      print('Inserting $employee');
      DBProvider.db.createEmployee(employee);
    }).toList();
    

    而不是

    return (response.data as List).map((employee) {
      print('Inserting $employee');
      DBProvider.db.createEmployee(Employee.fromJson(employee));
    }).toList();
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2019-12-03
    • 2019-10-31
    • 2019-11-30
    • 2019-08-16
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多