Intereting Posts
Получение текущих дней недели с датами Ошибка памяти при загрузке растровых изображений Снимок экрана Android OpenGL Разработка Android-тестов Анимированная анимация Android Layout при удалении, а затем добавление одного ребенка Android-приложение Gridview OnScrollListener ScrollUp и ScrollDown Android: findviewbyid: поиск вида по id, когда представление не находится на том же макете, который вызывается setContentView Ошибка GoogleAuthException при получении токена доступа с ClientID Выход инструмента Proguard retrace Цвет фона AndroidView WebView: прозрачный игнорируется на Android 2.2 Форматирование даты календаря Как получилось, что предварительный просмотр камеры в текстурном представлении гораздо более нечеткий, чем в плане поверхности? Сколько видов деятельности я должен использовать? Развернуть / свернуть анимацию панели инструментов Lollipop (приложение Telegram) Копирование и вставка Android с помощью TextView

Является ли способ, с помощью которого быстро запускаются функции быстрого запуска базы данных Firebase?

Я хочу создать поле приращения для статей.

Я имею в виду эту ссылку: https://firebase.google.com/docs/database/android/save-data#save_data_as_transactions

В примере есть код для поля приращения:

if (p.stars.containsKey(getUid())) { // Unstar the post and remove self from stars p.starCount = p.starCount - 1; p.stars.remove(getUid()); } else { // Star the post and add self to stars p.starCount = p.starCount + 1; p.stars.put(getUid(), true); } 

Но как я могу быть уверен, что пользователь уже любил / не разбирал статью?

В этом примере пользователь (хакер) может также очистить всю карту «Звезды», как это, и это все равно спасет:

 p.stars = new HashMap<>(); 

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

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

Любая помощь, предложения?

Solutions Collecting From Web of "Является ли способ, с помощью которого быстро запускаются функции быстрого запуска базы данных Firebase?"

Правила безопасности могут сделать несколько вещей:

  • Убедитесь, что пользователь может добавлять или удалять свой собственный uid узлу stars

     "stars": { "$uid": { ".write": "$uid == auth.uid" } } 
  • Убедитесь, что пользователь может только изменить starCount когда они добавляют свой собственный uid к узлу stars или удаляют его оттуда

  • Убедитесь, что пользователь может только увеличить / уменьшить значение starCount на 1

Даже с этим может оказаться сложным иметь правило безопасности, гарантирующее, что starCount равно количеству uids в узле stars . Я призываю вас попробовать, хотя и поделиться своим результатом.

Как я видел, большинство разработчиков справляется с этим, хотя это:

  • Сделайте начальный подсчет на клиенте (если размер узла stars не слишком велик, это разумно).
  • Имеют надежный процесс, запущенный на сервере, который объединяет stars в starCount . Он мог бы использовать child_added / child_removed события для увеличения / уменьшения.

Обновление: с рабочим примером

Я написал рабочий пример системы голосования. Структура данных:

 votes: { uid1: true, uid2: true, }, voteCount: 2 

Когда пользователь голосует, приложение отправляет многоуровневое обновление:

 { "/votes/uid3": true, "voteCount": 3 } 

А затем снять свой голос:

 { "/votes/uid3": null, "voteCount": 2 } 

Это означает, что приложение должно явно прочитать текущее значение для voteCount , с помощью:

 function vote(auth) { ref.child('voteCount').once('value', function(voteCount) { var updates = {}; updates['votes/'+auth.uid] = true; updates.voteCount = voteCount.val() + 1; ref.update(updates); }); } 

Это, по сути, транзакция с несколькими местоположениями, но затем встроенная в код приложения и правила безопасности вместо Firebase SDK и самого сервера.

Правила безопасности делают несколько вещей:

  1. Убедитесь, что voteCount может увеличиваться или уменьшаться на 1
  2. Обеспечить, чтобы пользователь мог добавлять или удалять только собственное голосование
  3. Обеспечить, чтобы увеличение счета сопровождалось голосованием
  4. Убедитесь, что уменьшение счета сопровождается «показом»,
  5. Обеспечить, чтобы голосование сопровождалось увеличением числа

Обратите внимание, что в правилах нет:

  • Убедитесь, что «unvote» сопровождается уменьшением количества (может быть сделано с помощью правила .write )
  • Повторение неудачных голосов / unvotes (для обработки одновременного голосования / опроса)

Правила:

 "votes": { "$uid": { ".write": "auth.uid == $uid", ".validate": "(!data.exists() && newData.val() == true && newData.parent().parent().child('voteCount').val() == data.parent().parent().child('voteCount').val() + 1 )" } }, "voteCount": { ".validate": "(newData.val() == data.val() + 1 && newData.parent().child('votes').child(auth.uid).val() == true && !data.parent().child('votes').child(auth.uid).exists() ) || (newData.val() == data.val() - 1 && !newData.parent().child('votes').child(auth.uid).exists() && data.parent().child('votes').child(auth.uid).val() == true )", ".write": "auth != null" } 

Jsbin с некоторым кодом для проверки этого: http://jsbin.com/yaxexe/edit?js,console