2016-03-19 5 views
0

Я просто изучаю Firebase и заметил, что любая операция просто заменяет данные, что немного отличается от того, что я видел на couchDB.Firebase - правильный способ реализовать отмененный .update()?

В моем понимании их документации, чтобы сделать откат/отмену операции .update(), я бы использовал метод .push(). Идея состояла бы в том, чтобы сохранить 2 версии данных, чтобы я мог запросить предыдущий объект. Чтобы загрузиться, нужно будет использовать подход FILO, чтобы я не хранил более двух элементов.

БАЗА ДАННЫХ ПЕРЕД ПЕРВЫМ WRITE:

myData 
+ someObject 
    - keyOne : valueOne 
    - keyTwo : valueTwo 

БАЗА ПОСЛЕ ПЕРВОГО WRITE ref.child(someObject).update({keyOne:valueOneUpdated}):

myData 
+ someObject 
    - keyOne : valueOneUpdated 
    - keyTwo : valueTwo 

выше, не является желаемым результатом, так как я потерял предыдущую версию элемента.

БАЗА ПОСЛЕ ПЕРВОГО WRITE ref.child(keyOne).push({keyOne:valueOneUpdated}):

myData 
+ someObject 
    + keyOne 
    + 1k34jh23kj4h : valueOneUpdated 
    + 237we8sjkdf8 : valueOne 
    - keyTwo : valueTwo 

Тьфу! Как нет метода pop(), чтобы удалить последний элемент такой операции, теперь я столкнулся с необходимостью как-то выяснить, что является первым и последним.

Наверняка должен быть какой-то изящный и простой способ сделать откат возможным, нет? Что мне не хватает?

Спасибо.

+0

Firebase не предоставляет встроенный механизм управления версиями данных. Существует множество способов создания системы управления версиями в базе данных. Какой из них лучше для вас, во многом зависит от потребностей вашего приложения. –

ответ

2

Если цель состоит в том, чтобы иметь один уровень отмены, это довольно просто.

myData 
    someObject 
    keyOne 
     currentValue: valueOneUpdated 
     priorValue: valueOne 
    keyTwo 
     currentValue: valueTwo 

Если priorValue узел существует, то позволить отмены, и переместить его значение в CurrentValue, а затем удалить предшествующее значение.

Вы можете расширить это с добавлением нескольких отмен за счет использования массива в Firebase

myData 
    someObject 
    keyOne 
     currentValue: valueOneUpdated 
     priorValues: 
      0: prior_value_3 //the value just prior to valueOneUpdated 
      1: prior_value_2 
      2: prior_value_1   

(концептуально) Самый последний priorValue имеет индекс 0, так читать его, «поп» его из стека и писать это значение currentValue и «переместить» другое значение вверх.

На самом деле нет функции «перемещать» значения в массиве в Firebase, поэтому просто читайте массив через код, удалите 0-й элемент и напишите массив обратно.

Я не большой поклонник Array's в Firebase вообще, поэтому есть другие, более расширяемые опции, но массив может соответствовать этому конкретному варианту использования.

+0

Благодарим вас за ответ. Поразмыслить над упомянутыми «другими подходами»? У меня тоже создается впечатление, что firebase на самом деле не хочет, чтобы вы хранили массивы. – tim

+1

@tim Array в порядке, но их использование ситуативно, так как часто есть лучшие варианты. В этом случае массив может соответствовать потребностям, поскольку он предоставляет автоматически индексированный набор пар ключ: значение.Другой вариант - использовать ту же структуру, что и в моем ответе, и в узле priorValues ​​вместо массива генерировать узлы с autoId в качестве ключа и значение отмены в качестве значения. Вы можете запросить ключ для самого последнего и удалить его, как он используется. Возможно, у вас также будет опция Redo, поэтому сохранение шагов отмены/повтора в качестве дочерних значений этого узла также будет работать. – Jay

+0

yea undo/redo Я полагаю, что это просто изменение индекса, если вы делаете повторное занятие. Поэтому я бы просто использовал 'keyOne: {0: valueOne, 1: valueOneUpdated}' – tim

 Смежные вопросы

  • Нет связанных вопросов^_^