Как построить структурированную базу данных Firebase в реальном времени для ios, swift? - PullRequest
0 голосов
/ 21 апреля 2020

В настоящее время я настраиваю свою базу данных firebase в реальном времени для моего ios приложения. Я впервые пытаюсь структурировать пользовательские данные в базе данных Firebase, и я действительно очень стараюсь понять некоторые ключевые вещи.

Немного контекста о потребностях базы данных моего приложения:

Когда создается новый пользователь, атрибуты, назначенные непосредственно пользователю:

  • Возраст
  • Электронная почта
  • Имя пользователя
  • Национальность

Позже пользователю потребуется возможность создания личных дневников! Каждый из этих дневников является массивом / списком объектов ... Где каждый объект в дневнике, кроме того, содержит несколько атрибутов в списке / массиве.

После прочтения всего, что я мог найти в любом месте, я представляю свою базу данных примерно так: это: Database Structure

Мне очень жаль, если он станет слишком конкретным c - я постараюсь сделать вопрос как можно более открытым:

Мои вопросы:

Как программно создать разных «детей» и как найти ключи, ведущие к ним, чтобы я мог обращаться к ним в другое время снова? (при редактировании атрибута в дочернем элементе).

Несколько методов, которые я пробовал:

  • setValue ([ArrayOfObjects]) -> Это создает требуемый массив, но я не могу найти, например, индекс 3 в этом массиве, чтобы позволить пользователю позже изменить свою электронную почту.

  • childByAutoID () -> Это также создает мой массив, но создает несколько других проблем: пользователь может сохранить только один дневник, но не может найти пути к указанному c indexes ...

  • setValue () иPriority () -> Кажется, не может сделать функцию приоритета. (Эта функция также устарела?)

  • И еще несколько ...

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

Или, по крайней мере, скажите мне, если я нахожусь на правильный путь относительно моей желаемой настройки базы данных. Достаточно ли она плоская? Есть ли более умный способ хранения всех этих созданных пользователями списков?

Большое вам спасибо! : -)

1 Ответ

1 голос
/ 22 апреля 2020

Я не знаю Swift, поэтому мои примеры приведены в Dart, но методы, на мой взгляд, похожи.

Во-первых, я бы разделил узел Users на два. Один для хранения пользовательских данных, который обычно довольно статичен c, а другой для хранения дневников. Вы бы использовали тот же ключ UID, что и оба. Таким образом, вам придется меньше беспокоиться о вложенности, и, следовательно, гораздо проще CRUD-данные. Если вы используете Firebase для аутентификации своих пользователей, я бы использовал уникальный ключ, который Firebase создает для каждого пользователя, в качестве ключей для этих двух узлов.

Затем ...

Чтобы создать пользователя запись узла данных код Dart будет выглядеть примерно так:

referenceUserData.child(<authenticated user id>).set({
  "age": <age value>,
  "email": <email value>,
  "name": <name value>,
});

Чтобы создать запись объекта узла дневника пользователя, код Dart будет выглядеть примерно так:

referenceUserData.child(<authenticated user id>).child(<diary key>).child(<diary object key>).set({
  "object info value 1": <object value>,
  "object info value 2": <object value>,
  "object info value 3": <object value>,
});

Вы также можете создать все объект записывает сразу, записывая их в виде списка (массива) с помощью .set ().

Вам также необходимо решить, каким должен быть ваш ключ дневника. Вы можете использовать Firebase для генерации уникального ключа, используя .push().set().

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

referenceUserData
  .child(<authenticated user id>)
  .once()
  .then(
(DataSnapshot snapshot) {
  print(snapshot.key);
  if (snapshot.value != null) {
    print(snapshot.value);
    <code to process your snapshot value>
  }
};

Кстати, «приоритет» унаследован с первых дней существования Firebase RTDB, поэтому я бы не стал его использовать.

...