Firebase-realtime-database, как вернуть данные внутри вложенного дочернего узла в виде списка - PullRequest
0 голосов
/ 16 марта 2020

Я создаю приложение для регистрации настроения, используя формы Xamarin для университетского проекта, но я ударился об стену, пытаясь вернуть данные, содержащиеся во вложенном дочернем узле. Пожалуйста, смотрите мою схему Firebase ниже:

BrainBreakApp

  • MoodLog # 1
    • уникальный идентификатор MoodLog, назначенный firebase
      • Рейтинг настроения
      • Примечание
      • Местоположение
      • Активность
        • Уникальный идентификатор активности, назначенный firebase
          • активность, зарегистрированная пользователь (например, Покупки )
        • Уникальный идентификатор активности, назначенный firebase
          • активность, зарегистрированная пользователем (например, Рабочая )
  • MoodLog # 2
  • MoodLog # 3 et c.

Я легко могу вернуть все данные в каждом журнале настроений, кроме данных в дочернем узле «Деятельности». Я поместил слова «покупки» и «работы» жирным шрифтом, потому что это данные, которые мне нужно вернуть.

В моей модели «MoodLog» я объявил атрибут «Деятельности» как список типа «Деятельность». «; которая представляет собой отдельную модель, просто содержащую атрибут «ActivityName». Поскольку мой текущий код стоит, мне нужно вернуть все действия для этого конкретного журнала в списке, который я могу назначить атрибуту «Деятельности» MoodLog.

Я пробовал несколько подходов, в том числе добавление оператора для возврата списка в назначении «Activity» и генерацию списка действий для каждого журнала эмоций отдельно и назначение возвращенного списка «Activity»; но явно не повезло. Проблема, с которой я постоянно сталкиваюсь при попытке создать отдельный список действий для этого журнала эмоций, - это возможность каждый раз получать доступ к ключу, сгенерированному с помощью firebase для этого конкретного журнала, а также возможность скорее возвращать тип List <> чем тип списка задач <>, который я не могу назначить атрибуту «Активность». Я признателен за то, что большая часть документации заявляет, чтобы сделать схему как можно более плоской, и если вы можете придумать более плоскую схему, которая будет служить той же цели, которая также будет фантастической c.

Я полный новичок в Firebase ie, поэтому любая помощь будет очень признательна! Я разместу свой текущий код ниже, и вы увидите, где мне нужно добавить список действий:

public async Task<List<EmotionLog>> GetAllLogsForPerson()
        {
            var allPersons = await GetAllLogs();
            await Firebase
                .Child(LogChildName)
                .OnceAsync<EmotionLog>();
            return allPersons.Where(a => a.UserId == personId).ToList();
        }


public async Task<List<EmotionLog>> GetAllLogs()
           {
            return (await Firebase
                .Child(LogChildName)
                .OnceAsync<EmotionLog>()).Select(item => new EmotionLog
                {
                    UserId = item.Object.UserId,
                    DateTime = item.Object.DateTime,
                    Note = item.Object.Note,
                    Location = item.Object.Location,
                    MoodRating = item.Object.MoodRating,
                    NoActivities = item.Object.NoActivities,
                    Activity =
                    {
                      // Need to add list of activities here
                    }
                }).ToList();
          }

РЕДАКТИРОВАТЬ:

Пожалуйста, смотрите код ниже используется для публикации данных журнала эмоций в базе данных Firebase. Сначала я добавляю все остальные данные журнала в метод «AddLog», а затем выполняю отдельные действия с помощью метода «AddActivity», который вызывается в методе «Add Log».

public async Task AddLog(string Id, string Note, string Location, DateTime DateTime, int MoodRating, List<string> ActivityList)
    {
        await Firebase
            .Child(LogChildName)
            .PostAsync(new EmotionLog() { UserId = Id, Note = Note, Location = Location, DateTime = DateTime, MoodRating = MoodRating});

       await AddActivity(Id, ActivityList);
    }

 public async Task AddActivity(string Id, List<string> ActivityList)
    {
        var toAddUserActivities = (await Firebase
            .Child(LogChildName)
            .OnceAsync<EmotionLog>()).Last(a => a.Object.UserId == Id);

        foreach (string item in ActivityList)
        {
            await Firebase
            .Child(LogChildName)
            .Child(toAddUserActivities.Key)
            .Child(ActivityChildName)
            .PostAsync(new Activity() { ActivityName = item });
        }
    }

1 Ответ

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

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

Как только я удалил код, который перебрал список активности и изменил мой список на тип List, все работало отлично :)

...