У меня есть приложение, которое довольно широко использует Firebase для хранения данных, которые содержат отношения. Я хочу убедиться, что я использую Firebase максимально безопасно в автономном режиме. Обеспокоенность в отношении безопасности, которую я имею, может быть продемонстрирована в следующем примере:
Предположим, у меня есть модель зоопарка, где каждый отдельный зоопарк хранится в Firebase как подузел "/zoos".
У меня есть модель Animal, где каждое отдельное животное хранится в Firebase как подузел "/animals".
В зоопарке могут быть животные, которые хранятся в упорядоченном списке. В частности, модель Zoo содержит массив Animal, например, [Животное]. Этот список животных хранится в Firebase как набор пар «позиция-ссылка» в «/ zoos / myZoo / animals», который будет содержать такие узлы, как:
{0: "animals / fidoTheDog"},
{1: "animals / jillTheCat"}
Когда я добавляю новое животное в зоопарк, мне нужно знать, сколько животных в настоящее время находится в этом зоопарке, чтобы я мог добавить новое животное в нужную позицию, например:
{2: "животные / jakeTheSnake"}
Если я в автономном режиме и случайно прочитал местоположение «zoos / myZoo / animals», чтобы получить список животных, чтобы я мог добавить нужную позицию, я хочу убедиться, что у меня есть точные данные. Я знаю, что если кто-то еще написал в эту позицию, когда я в автономном режиме и добавил другое животное в положение 2, я получу устаревшие данные, а когда я добавлю животное в положение 2, я перезапишу его запись в "zoos / myZoo / animals /" 2 ", когда я снова выхожу в интернет. Так что это проблема.
Но, если я знаю, что я буду единственным, кто будет писать в это место, могу ли я быть относительно уверен, что Firebase будет хранить для меня важные данные в "zoos / myZoo / animals", поскольку я использую isPersistenceEnabled = true? Другими словами, будет ли Firebase просто хранить эти данные в кэше, пока я недавно писал в это местоположение или недавно читал из этого места?
Или мне нужно явно указать "keepSynced (true)" в этом месте? Это приводит к основной общей версии вопроса - как Firebase выбирает, что хранить в своем кеше с isPersistenceEnabled = true? Особенно, если я специально не установил keepSynced (true) в каких-либо конкретных местах. Будет ли Firebase определять приоритеты недавно прочитанных данных, а затем, когда достигнут предел в 10 МБ, сначала отбросить старые данные? Имеет ли значение, если я записал данные в это место давным-давно, но постоянно читал из этого места? Будет ли оно по-прежнему сохранять это местоположение в кэше, потому что оно было недавно прочитано? Будет ли он когда-либо отбрасывать данные до достижения лимита в 10 МБ?
Я немного новичок, поэтому спасибо за ваше терпение со мной!
-------------- СЛЕДУЙТЕ ЗА ВОПРОСАМИ --------------
Пара уточняющих вопросов.
Я думаю, что предложенный в блоге (предложенный Фрэнком в комментариях) подход к использованию childByAutoID звучит хорошо. Поэтому, если я сохраняю зоопарк со многими животными (по порядку), то звучит так, будто я перебираю животных и использую childByAutoID, чтобы создать новый ключ для каждого животного, значение которого будет ссылкой на местоположение объекта животного. Могу ли я быть уверен, что ключи, которые я создаю в быстрой последовательности (циклы, вероятно, будут очень быстрыми), в конечном итоге будут правильно сортироваться при лексикографическом порядке? Я смотрю на это сообщение в блоге и предполагаю, что это так. https://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html
Предположим, я делаю что-то более сложное, например, вставляю животное в начале списка в нулевую позицию. Затем, прежде чем приступить к операции, я синхронизировал список животных в зоопарке, как это было предложено в сообщении в блоге, которое вы отправили. https://firebase.googleblog.com/2014/04/best-practices-arrays-in-firebase.html. Если пользователь не в сети, я не могу быть уверен, что у меня будет самая свежая копия. Но предположим, что я согласен с этим, потому что пользователи будут работать только со своими данными и только на своем собственном устройстве. В этом случае помогает ли использовать keepSynced (true) на пути к зоопарку? Или, поскольку объем данных, с которыми работает пользователь, не превышает 10 МБ (вся база данных сейчас составляет 300 КБ для 10-ти активных пользователей), могу ли я просто предположить, что кэш будет хранить данные в пути зоопарка (независимо от того, будет ли KeepSynced или нет). ) потому что мы никогда не будем флиртовать с лимитом 10 Мб в любом случае?
Спасибо!