получение конкретных данных из PraseQuery flutter

#flutter #dart #parse-platform #query-builder #back4app

Вопрос:

Я использую back4app.com сервисы (Prase SDK) в моем проекте flutter для обработки моего бэкенда.

в этом методе я пытаюсь выполнить запрос к определенному объекту :

 
Future<List> getList(String date) async {
    final QueryBuilder<ParseObject> parseQuery =
        QueryBuilder<ParseObject>(ParseObject('UsersEaten'));

    parseQuery
      ..whereContains('eatenBy', getUsrName!)
      ..whereEqualTo('eatenDate', date);

    final ParseResponse apiResponse = await parseQuery.query();

    if (apiResponse.success amp;amp; apiResponse.results != null) {
      List<dynamic>? apiRes = apiResponse.results;

 

и у меня есть все данные об этом объекте в виде списка карт :

 [{"className":"UsersEaten","objectId":"OmrLz358Cb","createdAt":"2021-09-12T11:27:41.824Z","updatedAt":"2021-09-12T11:27:41.824Z","eatenTitle":"egg roll","eatenCal":180,"eatenFat":40,"eatenProtein":30,"eatenCarb":10,"eatenBy":"usr45","eatenDate":"2021-09-12"}, {"className":"UsersEaten","objectId":"lWIeMw54mH","createdAt":"2021-09-12T12:37:21.389Z","updatedAt":"2021-09-12T12:37:21.389Z","eatenTitle":"meat butter","eatenCal":235,"eatenFat":34,"eatenProtein":34,"eatenCarb":9,"eatenBy":"usr45","eatenDate":"2021-09-12"}]

 

но мне не нужны целые данные , мне просто нужен конкретный ключ, Значения из этой карты, например, мне просто нужны значения ключей, доступные пользователям, как я должен применить этот фильтр в своем запросе???

Ответ №1:

В случае, если я правильно понял ваш вопрос, вы хотите уменьшить количество ключей, возвращаемых сервером. Этого можно достичь с помощью keysToReturn(List<String> keys) .

  /// Define which keys in an object to return.
 ///
 /// [String] keys will only return the columns of a result you want the data for,
 /// this is useful for large objects
 void keysToReturn(List<String> keys) {
    limiters['keys'] = concatenateArray(keys);
 }
 

Таким образом, ваш запрос может выглядеть примерно так:

 parseQuery
  ..whereContains('eatenBy', getUsrName!)
  ..whereEqualTo('eatenDate', date)
  keysToReturn(['YOUR_KEY_THAT_SHOULD_BE_RETURNED']);
 

Существует также полная противоположность этому доступному методу, называемому excludeKeys(List<String> keys) .

Комментарии:

1. Я ценю это , это прекрасно работает с этим методом.

Ответ №2:

Создайте класс данных, я выбрал Example для него имя

 class Example {
  String? className;
  String? objectId;
  String? createdAt;
  String? updatedAt;
  String? eatenTitle;
  int? eatenCal;
  int? eatenFat;
  int? eatenProtein;
  int? eatenCarb;
  String? eatenBy;
  String? eatenDate;
 
  Example({
    this.className,
    this.objectId,
    this.createdAt,
    this.updatedAt,
    this.eatenTitle,
    this.eatenCal,
    this.eatenFat,
    this.eatenProtein,
    this.eatenCarb,
    this.eatenBy,
    this.eatenDate,
  });

  

  Map<String, dynamic> toMap() {
    return {
      'className': className,
      'objectId': objectId,
      'createdAt': createdAt,
      'updatedAt': updatedAt,
      'eatenTitle': eatenTitle,
      'eatenCal': eatenCal,
      'eatenFat': eatenFat,
      'eatenProtein': eatenProtein,
      'eatenCarb': eatenCarb,
      'eatenBy': eatenBy,
      'eatenDate': eatenDate,
    };
  }

  factory Example.fromMap(Map<String, dynamic> map) {
    return Example(
      className: map['className'],
      objectId: map['objectId'],
      createdAt: map['createdAt'],
      updatedAt: map['updatedAt'],
      eatenTitle: map['eatenTitle'],
      eatenCal: map['eatenCal'],
      eatenFat: map['eatenFat'],
      eatenProtein: map['eatenProtein'],
      eatenCarb: map['eatenCarb'],
      eatenBy: map['eatenBy'],
      eatenDate: map['eatenDate'],
    );
  }

  String toJson() => json.encode(toMap());

  factory Example.fromJson(String source) => Example.fromMap(json.decode(source));
}
 

К сожалению, я не знаю, как пользоваться этой услугой back4app.com, но это должно выглядеть так

 if (apiResponse.success amp;amp; apiResponse.results != null) {
      
    
    final maps = jsonDecode(apiResponse.results).cast<Map<String, dynamic>>();

    var exampleList = List.generate(maps.length, (i) {
      return Example.fromMap(maps[i]);
    });

    //sum of calories
    num sum = 0;
    exampleList.forEach((element){sum  = element.eatenCal;});
    print(sum);
    
}
 

Комментарии:

1. большое спасибо , теперь есть ли какой-нибудь способ суммировать эти элементы? Я имею в виду exampleList.forEach((элемент) {печать(элемент.eatenCal);}); возвращаемые числа теперь как мне собрать и суммировать эти числа?

2. Например, какое-то поле eatenCal с цифрами.. Я исправил свой ответ и добавил расчет суммы в последних 3 строках. Таким образом, вы можете рассчитать все, что захотите, исходя из поступившей к вам информации.

3. Я действительно ценю это . все это хорошо, но в моей консоли у меня есть два числа: первое- eatenCal номер первого элемента в списке, а второе-сумма всего списка. почему у меня первый номер?