Firebase: как сгенерировать уникальный цифровой идентификатор для ключа?
Мне нужны числовые идентификаторы для удобства чтения. Как я могу получить его в Firebase?
Я хочу иметь числовой идентификатор для ключей, например. "000000001", "000000002", "00000003", "00000004".
Причина, в которой я нуждаюсь, заключается в том, что эти идентификаторы станут постоянным идентификатором объекта как онлайн, так и офлайн. Я хочу, чтобы пользователи могли просматривать эту страницу объекта, просто введя URL "/objects/00000001" без усилий.
Я спрашиваю здесь, потому что я хочу знать, можно ли это сделать без использования .priority
, под-свойств и т.д. Я думаю, что метод set
может сделать это как-то. Если это невозможно, просто скажите мне нет, я могу принять этот ответ.
Ответы
Ответ 1
Я предлагаю прочитать документацию Firebase. В частности, см. Раздел Сохранение данных в веб-интерфейсе JavaScript Firebase.
Из руководства:
Получение уникального идентификатора Создано нажатием()
Вызов push() возвращает ссылку на новый путь данных, который вы можете использовать для получения значения его идентификатора или установки данных. Следующий код приведет к тем же данным, что и в приведенном выше примере, но теперь у нас будет доступ к уникальному идентификатору push, который был сгенерирован
// Generate a reference to a new location and add some data using push()
var newPostRef = postsRef.push({
author: "gracehop",
title: "Announcing COBOL, a New Programming Language"
});
// Get the unique ID generated by push() by accessing its key
var postID = newPostRef.key;
Источник: https://www.firebase.com/docs/web/guide/saving-data.html
- Нажатие генерирует новый путь передачи данных с отметкой времени сервера как
key
. Эти клавиши выглядят как -JiGh_31GA20JabpZBfa
, поэтому не числовые.
- Если вы хотите сделать числовой идентификатор, вы должны сделать это параметром объекта, чтобы избежать перезаписи сгенерированного ключа.
- Ключи (пути к новым данным) гарантированно уникальны, поэтому нет необходимости переписывать их с помощью числового ключа.
- Вместо этого вы можете установить числовой идентификатор в качестве дочернего объекта.
- Затем вы можете запросить объекты с помощью этого дочернего элемента ID с помощью Firebase Queries.
Из руководства:
В JavaScript шаблон вызова push(), а затем сразу вызывающий set() настолько распространен, что мы позволяем вам объединять их, просто передавая данные, которые должны быть установлены непосредственно для push() следующим образом. Обе следующие операции записи приведут к тому, что одни и те же данные будут сохранены в Firebase:
// These two methods are equivalent
postsRef.push().set({
author: "gracehop",
title: "Announcing COBOL, a New Programming Language"
});
postsRef.push({
author: "gracehop",
title: "Announcing COBOL, a New Programming Language"
});
Источник: https://www.firebase.com/docs/web/guide/saving-data.html
Ответ 2
Как объяснялось выше, вы можете использовать push-идентификатор Firebase по умолчанию.
Если вы хотите что-то числовое, вы можете сделать что-то на основе отметки времени, чтобы избежать столкновений
что-то, основанное на дате, часе, секунде, мс и некотором случайном int в конце
01612061353136799031
Что переводится как:
016-12-06 13:53:13:679 9031
Все зависит от необходимой точности (номера социального страхования делают то же самое с некоторыми случайными символами в конце даты). Например, сколько транзакций ожидается в течение дня, часа или секунды. Вы можете снизить точность, чтобы облегчить ввод текста.
Вы также можете сделать транзакцию, которая увеличивает номер ID, и в случае успеха у вас будет уникальный последовательный номер для этого пользователя. Это можно сделать на стороне клиента или сервера.
(https://firebase.google.com/docs/database/android/read-and-write)
Ответ 3
Как сказано в документации, этого можно достичь, просто используя set
вместо push
.
Как говорится в документации, это не рекомендуется (из-за возможной перезаписи другим пользователем в одно и то же время).
Но в некоторых случаях полезно иметь контроль над содержимым канала, включая ключи.
В качестве примера webapp в js, 193 является вашим идентификатором, сгенерированным в другом месте, просто:
firebase.initializeApp(firebaseConfig);
var data={
"name":"Prague"
};
firebase.database().ref().child('areas').child("193").set(data);
Это перезапишет любую область с меткой 193 или создаст ее, если она еще не существует.