Извлечение данных из базы данных в Dart

#flutter #dart

#flutter #dart

Вопрос:

У меня есть следующая функция, которая извлекает данные заказа из базы данных для каждого пользователя. Моя цель — распечатать заказы каждого пользователя. Однако я получаю некоторые странные ошибки.

Вот функция:

 Future<void> fetchAllOrders() async {
    final url =
        'https://tb-936.firebaseio.com/orders.json?auth=$authToken';
    final response = await http.get(url);
    final List<OrderItem> loadedOrders = [];
    final extractedData = json.decode(response.body) as Map<String, dynamic>;
    print('Extracted data is '   extractedData.toString()); 
    extractedData.forEach((userId, orderData) {
      print('Order data is '   orderData.toString()); 
     print(orderData['amount']); 
     print(orderData['dateTime']); 
     print(orderData['deliveryMethod']); 
     print(orderData['uniqueOrderNumber']); 
     print(orderData['isOrderComplete']); 
     print(orderData['userId']); 
    });
  }
 

Вот журнал консоли для извлеченных данных:

  {12345: {-MMqL1Tkg-XXNHbKGz62: {amount: 75000.0, dateTime: 2020-11-23T21:22:51.817939, deliveryMethod: delivery, isOrderComplete: false, products: [{id: 2020-11-23 21:22:47.023541, price: 25000.0, quantity: 3, title: Mchuzi}], uniqueOrderNumber: TBOJ43, userId: 12345}}, 67890: {-MNY9DoItO4Vo9K0EOd5: {amount: 250000.0, dateTime: 2020-12-02T14:14:12.022284, deliveryMethod: pickup, isOrderComplete: false, products: [{id: 2020-12-02 14:13:32.093068, price: 25000.0, quantity: 10, title: Mchuzi}], uniqueOrderNumber: TBQKJP, userId: 67890}}}
 

Где 12345 и 67890 — идентификаторы пользователей.

Вот журнал консоли для orderData внутри цикла for:

 Order data is {-MMqL1Tkg-XXNHbKGz62: {amount: 75000.0, dateTime: 2020-11-23T21:22:51.817939, deliveryMethod: delivery, isOrderComplete: false, products: [{id: 2020-11-23 21:22:47.023541, price: 25000.0, quantity: 3, title: Mchuzi}], uniqueOrderNumber: TBOJ43, userId: 12345}}
I/flutter ( 5975): null
I/chatty  ( 5975): uid=10227(com.example.tb) 1.ui identical 4 lines
I/flutter ( 5975): null
I/flutter ( 5975): Order data is {-MNY9DoItO4Vo9K0EOd5: {amount: 250000.0, dateTime: 2020-12-02T14:14:12.022284, deliveryMethod: pickup, isOrderComplete: false, products: [{id: 2020-12-02 14:13:32.093068, price: 25000.0, quantity: 10, title: Mchuzi}], uniqueOrderNumber: TBQKJP, userId: 67890}}
I/flutter ( 5975): null
I/chatty  ( 5975): uid=10227(com.example.tb) 1.ui identical 4 lines
I/flutter ( 5975): null
D/Surface ( 5975): Surface::disconnect(this=0x7e78146000,api=1)
D/Surface ( 5975): Surface::disconnect(this=0x7e78146000,api=-1)
D/Surface ( 5975): Surface::disconnect(this=0x7e78033000,api=1)
 

Есть идеи, почему я получаю нули?

Ответ №1:

Как упоминалось @Adithya Shetty, вы используете неправильные ключи, потому orderData что на самом деле ваш объект имеет только одно свойство — {-MMqL1Tkg-XXNHbKGz62 для пользователя 12345 и -MNY9DoItO4Vo9K0EOd5 для пользователя 67890 .

Чтобы иметь возможность достичь нужного вам результата и получить к нему доступ динамически, вам необходимо добавить еще forEach один внутри вашего forEach :

 Future<void> fetchAllOrders() async {
    final url =
        'https://tb-936.firebaseio.com/orders.json?auth=$authToken';
    final response = await http.get(url);
    final List<OrderItem> loadedOrders = [];
    final extractedData = json.decode(response.body) as Map<String, dynamic>;

    print('Extracted data is '   extractedData.toString()); 

    extractedData.forEach((userId, order) {
      print('User id: $userId');

      order.forEach((orderKey, orderData) {
        print('Order data is '   orderData.toString()); 
        print('Order key: $orderKey');
        print(orderData['amount']); 
        print(orderData['dateTime']); 
        print(orderData['deliveryMethod']); 
        print(orderData['uniqueOrderNumber']); 
        print(orderData['isOrderComplete']); 
        print(orderData['userId']); 
      });
    });
  }
 

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

1. да, вы правы, это был бы лучший подход вместо жесткого кодирования карт

Ответ №2:

Вы используете неправильные ключи, поэтому вы получаете null.

Чтобы получить сумму из вложенной карты, вам нужно будет сделать что-то вроде этого:

 map data1 = orderData['12345'];
map data2 = data1['-MMqL1Tkg-XXNHbKGz62']; 
map amount = data2['amount'];
 

Из orderData.toString выходных данных вы можете получить представление о структуре карты.

Ваш вывод выглядит следующим образом:

 {12345: {-MMqL1Tkg-XXNHbKGz62: {amount: 75000.0, dateTime: 2020-11-23T21:22:51.817939, deliveryMethod: delivery, isOrderComplete: false, products: [{id: 2020-11-23 21:22:47.023541, price: 25000.0, quantity: 3, title: Mchuzi}], uniqueOrderNumber: TBOJ43, userId: 12345}}, 67890: {-MNY9DoItO4Vo9K0EOd5: {amount: 250000.0, dateTime: 2020-12-02T14:14:12.022284, deliveryMethod: pickup, isOrderComplete: false, products: [{id: 2020-12-02 14:13:32.093068, price: 25000.0, quantity: 10, title: Mchuzi}], uniqueOrderNumber: TBQKJP, userId: 67890}}}
 

Теперь, если вы внимательно посмотрите, вы найдете 12345 и 67890 в качестве первого ключа внутри этой сложной карты, который
теперь является идентификатором пользователя,

ключ 12345 содержит вложенные map ключи и данные with следующим образом:

 -MMqL1Tkg-XXNHbKGz62: {amount: 75000.0, dateTime: 2020-11-23T21:22:51.817939, deliveryMethod: delivery, isOrderComplete: false, products: [{id: 2020-11-23 21:22:47.023541, price: 25000.0, quantity: 3, title: Mchuzi}], uniqueOrderNumber: TBOJ43, userId: 12345}
 

-MMqL1Tkg-XXNHbKGz62 это уникальный ключ, и нужные вам данные отображаются внутри него

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

1. Я не совсем уверен, что следую. Во второй строке вы жестко закодировали идентификатор заказа. Но как вы на самом деле их извлекаете?

2. вторая строка — это уникальный ключ, который генерируется firebase, и выполнение его динамически было бы сложной задачей. Было бы лучше, если бы вы использовали плагин Firebase, или я предполагаю, что это идентификатор документа, который генерируется автоматически, если вы явно не указали уникальный идентификатор для всех документов, я не уверен в этом на 100%, но это похоже на идентификатор документа

3. Ответ @kovalyovi — лучший подход к этому вопросу