Получение значения из базы данных реального времени Firebase (Qt c ++) - PullRequest
0 голосов
/ 17 января 2020

Я использую Qt для разработки приложения для Android, в данный момент я пытаюсь получить значение из своей базы данных Firebase в реальном времени, но продолжаю получать 0 ( false ) для firebase::kFutureStatusPending. Я могу установить значение с помощью SetValue() в своей базе данных, и я проверил url с помощью dbref.Child(user->uid()).Child("Nickname").url(), и это правильно. Вот фрагмент моего кода, связанный с этой частью, и я также включил структуру JSON в конце:

firebase::database::Database *database=firebase::database::Database::GetInstance(_app);
dbref = database->GetReferenceFromUrl("https://***/");

firebase::Future<firebase::database::DataSnapshot> result =
    dbref.Child(user->uid()).Child("Nickname").GetValue();


if (result.status() != firebase::kFutureStatusPending) {
  if (result.status() != firebase::kFutureStatusComplete) {
    qDebug() <<"ERROR: GetValue() returned an invalid result.";

  } else if (result.error() != firebase::database::kErrorNone) {
    qDebug() << result.error_message();

  } else {
    firebase::database::DataSnapshot snapshot = *result.result();
    qDebug() << "snapshot available" ;
  }
}

else {
    qDebug() << "results are still pending";
}

Как я могу получить значение Nickname child (то есть Raad в данном случае) по моему Qt Android app?

Вот содержимое файла JSON:

{
  "YQEa5KquWgOiPHfD7SLSgU92mTH2" : {
    "Email Address" : "shariatraad@gmail.com",
    "Nickname" : "Raad"
  }
}

Ответы [ 2 ]

1 голос
/ 17 января 2020

При копировании кода из документации , вы пропустили этот комментарий, похоже:

// In the game loop that polls for the result...

if (result.status() != firebase::kFutureStatusPending) {
  if (result.status() != firebase::kFutureStatusComplete) {

Поскольку данные загружаются асинхронно, result.status() не будет полный правильный путь. По этой причине вам нужно иметь этот чек в вашей игре l oop или в каком-то другом месте, которое запускается неоднократно.

В качестве альтернативы вы можете использовать Future.onCompletion, как показано здесь :

// Or, set an OnCompletion callback, which accepts a C++11 lambda or
// function pointer. You can pass your own user data to the callback. In
// most cases, the callback will be running in a different thread, so take
// care to make sure your code is thread-safe.
future.OnCompletion([](const Future< SampleResultType >& completed_future,
                       void* user_data) {
  // We are probably in a different thread right now.
  if (completed_future.error() == 0) {
    DoSomethingWithResultData(completed_future.result());
  }
  else {
    LogMessage("Error %d: %s",
               completed_future.error(),
               completed_future.error_message());
  }
}, user_data);

Но и в этом случае важно убедиться, что (main из) ваша программа не завершит работу до того, как будут получены данные, или вы никогда не увидите их.

0 голосов
/ 17 января 2020

Я решил проблему, добавив это в код:

result.OnCompletion([](const firebase::Future<firebase::database::DataSnapshot>& completed_future){
    if (completed_future.error() == 0)
    {
       //Do what you need to do with your value here
    }
}
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...