Flutter: сделать модель для сохранения json в sqlite и возврата данных в виде объекта - PullRequest
0 голосов
/ 05 марта 2020

У меня есть это json:

{
"ProductCoreId":0,
"LifeCycle":1,
"OwnerPartyRoleId":0,
"TriggerImages":null,
"TriggerImagesUrl":[
"/Files/Images/Channels/sdp.png"
],
"TriggerChannelIds":[
1287
],
"ActionImages":null,
"ActionImagesUrl":[]
}

Как видите, у меня есть 2 списка TriggerImagesUrl и TriggerChannelIds. Теперь я хочу сохранить эту модель json в sqlite, поэтому я сделал эту модель класса в соответствии с моим json для сохранения в базе данных:

class ToolsByChannelIdDbModel {
  int productCoreId;
  int lifeCycle;
  int ownerPartyRoleId;
  Null triggerImages;
  String triggerImagesUrl;
  String triggerChannelIds;

      ToolsByChannelIdDbModel(
          {this.productCoreId,
          this.lifeCycle,
          this.ownerPartyRoleId,
          this.triggerImages,
          this.triggerImagesUrl,
          this.triggerChannelIds});

      ToolsByChannelIdDbModel.fromJson(Map<String, dynamic> json) {
        productCoreId = json['ProductCoreId'];
        lifeCycle = json['LifeCycle'];
        ownerPartyRoleId = json['OwnerPartyRoleId'];
        triggerImages = json['TriggerImages'];
        triggerImagesUrl = json['TriggerImagesUrl'];
        triggerChannelIds = json['TriggerChannelIds'];
      }

      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = new Map<String, dynamic>();
        data['ProductCoreId'] = this.productCoreId;
        data['LifeCycle'] = this.lifeCycle;
        data['OwnerPartyRoleId'] = this.ownerPartyRoleId;
        data['TriggerImages'] = this.triggerImages;
        data['TriggerImagesUrl'] = this.triggerImagesUrl;
        data['TriggerChannelIds'] = this.triggerChannelIds;
        return data;
      }
    }

Поскольку вы теперь sqlite не принимаете список как тип, так я сделал список в виде json строки, поэтому я сохранил это так:

 ToolsByChannelIdDbModel model = ToolsByChannelIdDbModel();
 model.productCoreId = item.productCoreId;
 model.lifeCycle = item.lifeCycle;
 model.ownerPartyRoleId = item.ownerPartyRoleId;
 model.triggerImagesUrl = jsonEncode(item.triggerImagesUrl);
 model.triggerChannelIds = jsonEncode(item.triggerChannelIds);
 db.insert("tools_table", model.toJson());

item.triggerImagesUrl и item.triggerChannelIds - это список, и я отображаю их в json строку для сохранения в базе данных. До сих пор все хорошо и эти списки сохраняются в базе данных. Проблема возникает, когда я делаю запрос и хочу декодировать результат db.rawQuery в мой объект.

  Future<List<ToolsByChannelIdDbModel>> getTools(
      int channelId) async {
    List<ToolsByChannelIdDbModel> list = 
    try {
      var result = await DBProvider.db.getToolsById(channelId);
      result.forEach((item) {
        list.add(ToolsByChannelIdDbModel.fromJson(item));
      });
    } catch (e) {
      print(e);
    }
    return list;
  }
}

await DBProvider.db.getToolsById(channelId); часть работает нормально и возвращает карту данных и triggerImagesUrl и triggerChannelIds являются json строкой, но когда я хочу преобразовать карту в мой объект с помощью ToolsByChannelIdDbModel.fromJson(item) в этом разделе:

String triggerImagesUrl; String triggerChannelIds;

В модели я получил ошибку, потому что я объявляю эти поля как String, но они являются списками.

Как сохранить эти списки в базе данных и как сопоставить их с объектом?

1 Ответ

0 голосов
/ 06 марта 2020

Попробуйте это:

class ToolsByChannelIdDbModel {
    int productCoreId;
    int lifeCycle;
    int ownerPartyRoleId;
    dynamic triggerImages;
    List<String> triggerImagesUrl;
    List<int> triggerChannelIds;
    dynamic actionImages;
    List<dynamic> actionImagesUrl;

   /* Create instance without ID (database will auto generate one if you specified an 
   id column)*/       

   ToolsByChannelIdDbModel({
    this.lifeCycle,
    this.ownerPartyRoleId,
    this.triggerImages,
    this.triggerImagesUrl,
    this.triggerChannelIds,
    this.actionImages,
    this.actionImagesUrl,
  });

  // Create instance with ID  

  ToolsByChannelIdDbModel.withId({
    this.productCoreId,
    this.lifeCycle,
    this.ownerPartyRoleId,
    this.triggerImages,
    this.triggerImagesUrl,
    this.triggerChannelIds,
    this.actionImages,
    this.actionImagesUrl,
  });

  /* When you want to add object to database you can use .toMap() this will 
    convert ToolsByChannelIdDbModel instance to a Map*/  

  Map<String, dynamic> toMap()
  {
      var tempMap = Map<String, dynamic>();
      if(productCoreId != null)
      { 
          tempMap['productCoreId'] = productCoreId; 
      }
      tempMap['lifeCycle'] = lifeCycle;
      tempMap['ownerPartyRoleId'] = ownerPartyRoleId;
      tempMap['triggerImages'] = triggerImages;
      tempMap['triggerImagesUrl'] = List<dynamic>.from(triggerImagesUrl.map((x) => 
      x));
      tempMap['triggerChannelIds'] = List<dynamic>.from(triggerChannelIds.map((x) => 
      x));
      tempMap['actionImages'] = actionImages;
      tempMap['actionImagesUrl'] = List<dynamic>.from(actionImagesUrl.map((x) => 
      x));

      return tempMap;
  }

  /* Named constructor to create ToolsByChannelIdDbModel instance from a Map that you 
  get from database */     

  ToolsByChannelIdDbModel.fromMap(Map<String, dynamic> map)
  {
      this.productCoreId = map['productCoreId'];
      this.lifeCycle = map['lifeCycle'];
      this.ownerPartyRoleId = map['ownerPartyRoleId'];
      this.triggerImages = map['triggerImages'];
      this.triggerImagesUrl = List<String>.from(map['triggerImagesUrl'].map((x) => 
      x));
      this.triggerChannelIds = List<int>.from(map['triggerChannelIds'].map((x) => 
      x));
      this.actionImages = map['actionImages'];
      this.actionImagesUrl = List<dynamic>.from(map['actionImagesUrl'].map((x) => 
      x));
  }
}

Надеюсь, это помогло !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...