Как хранить данные Firebase в массиве и распечатывать их?

Я пытался сохранить данные firebase в массив и распечатать их весь день, но безрезультатно. Буду очень признателен за помощь сообщества.

Ниже показано, как выглядит текущая база данных firebase:

введите здесь описание изображения

Ниже приведен код того, как выглядит функция чтения данных из firebase:

- (void)readDataFromServer {

_ref = [[FIRDatabase database] reference];

_hotelRef = [_ref child:@"hotel bookings"];

NSString *userID = [FIRAuth auth].currentUser.uid;

FIRDatabaseQuery *userHotelBookingsQuery = [[_hotelRef child:userID] queryOrderedByChild:@"number"];

[userHotelBookingsQuery observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {

    if (snapshot.value == [NSNull null]) {

        NSLog(@"No messages");

    } else {

    [self.arrayOfBookingDetail removeAllObjects];

    self.arrayOfBookingDetail = (snapshot.value);

    NSString *firstMessage = [self.arrayOfBookingDetail objectAtIndex:0];

    NSLog(@"First message is: %@", firstMessage);

    }


 }];

}

person Tony Ong    schedule 06.06.2016    source источник
comment
добавьте код к вашему вопросу вместо изображения!   -  person Shubhank    schedule 06.06.2016
comment
вы хотите читать данные или записывать данные???? ваша функция связана с чтением данных... так что вы хотите в основном   -  person EI Captain v2.0    schedule 06.06.2016
comment
извините, я не знал, что сообщество предпочитает реальный код изображению. Я внесу изменения. Я хочу прочитать данные, вставить в массив и отобразить их.   -  person Tony Ong    schedule 06.06.2016


Ответы (1)


Ваш код не работает, потому что вы получаете дочерний элемент от пользователя uid, которого на самом деле не существует. K2xxxxxxxx — это уникальная строка для каждого элемента, которая не соответствует идентификатору пользователя. Попробуй это

_ref = [[FIRDatabase database] reference];

_hotelRef = [_ref child:@"hotel bookings"];

FIRDatabaseQuery *userHotelBookingsQuery = [_hotelRef queryOrderedByChild:@"number"];

[userHotelBookingsQuery observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {

    if (snapshot.value == [NSNull null]) {
        NSLog(@"No messages");
    } else {
      //[self.arrayOfBookingDetail removeAllObjects];
      //self.arrayOfBookingDetail = (snapshot.children);
      //NSString *firstMessage = [self.arrayOfBookingDetail objectAtIndex:0];
      //NSLog(@"First message is: %@", firstMessage);
      NSDictionary *allUsersData = (NSDictionary*)snapshot.value;
      for (NSString *key in allUsersData.allKeys) {
           NSLog("@key is %@, data is %@",key,allUsersData[key]);
      }
    }

 }];

}

Редактировать :

Чтобы запросить конкретного пользователя, измените свой запрос на

 FIRDatabaseQuery *userHotelBookingsQuery = [[_hotelRef queryOrderedByChild:@"userID"] queryEqualToValue:@"GEmxxxxxxxxx"];
person Shubhank    schedule 06.06.2016
comment
Я понимаю. На изображении базы данных выше показан список бронирований отелей различными пользователями. Я хотел запросить все бронирования отелей конкретным пользователем. - person Tony Ong; 06.06.2016
comment
Я попытался запустить код, который вы дали, NSLog возвращает первое сообщение: Null. что я не уверен, почему. - person Tony Ong; 06.06.2016
comment
Спасибо. В моем логическом потоке я не буду знать, какой пользователь будет входить в систему. Вот почему я использовал NSString *userID = [FIRAuth auth].currentUser.uid; чтобы получить текущего пользователя для входа в систему, верните его / ее запись о бронировании отелей. - person Tony Ong; 06.06.2016
comment
Я не понял это ? пожалуйста, объясните больше. - person Shubhank; 06.06.2016
comment
Я не думаю, что разумно жестко указывать идентификатор пользователя @GEmxxxxxxxxxx. - person Tony Ong; 06.06.2016
comment
да, я просто добавил для примера. вы можете заменить его текущим зарегистрированным пользователем uid - person Shubhank; 06.06.2016