автоматически удалять информацию о firebase на основе даты android [duplicate]

Когда вы передаете строку разметки в $, она анализируется как HTML, используя свойство innerHTML браузера на

(или другой подходящий контейнер для особых случаев, таких как ). innerHTML не может анализировать SVG или другой не-HTML-контент, и даже если бы он не мог сказать, что должен был находиться в пространстве имен SVG.

innerHTML ] недоступно в SVGElement - это свойство только HTMLElement. В настоящее время нет свойства innerSVG или другого способа (*) для анализа содержимого в SVGElement. По этой причине вам следует использовать методы типа DOM. jQuery не дает вам легкий доступ к методам, поддерживающим имена, необходимые для создания элементов SVG. Действительно, jQuery не предназначен для использования с SVG вообще, и многие операции могут завершиться неудачно.

HTML5 обещает позволить вам использовать без xmlns внутри обычного HTML (text/html) документа в будущее. Но это всего лишь взлом для анализатора (**), содержимое SVG по-прежнему будет SVGElements в пространстве имен SVG, а не HTMLElements, поэтому вы не сможете использовать innerHTML, даже если они выглядят как часть HTML-документа.

Однако для современных браузеров вы должны использовать HTML-код X (должным образом исполненный как application/xhtml+xml; сохранить с расширением .xhtml для локального тестирования ), чтобы заставить SVG работать вообще. (В любом случае это имеет смысл: SVG - это стандарт, основанный на стандартах XML). Это означает, что вам придется избегать символов < внутри вашего блока сценариев (или заключить в раздел CDATA) и включить XHTML xmlns. Пример:




    
    

*: ну, есть DOM Level 3 LS parseWithContext , но поддержка браузера очень плохая. Изменить для добавления: однако, пока вы не можете вводить разметку в SVGElement, вы можете добавить новый SVGElement в HTMLElement с помощью innerHTML, а затем перенести его на желаемую цель. Скорее всего, это будет немного медленнее:


**: Я ненавижу то, как авторы HTML5, похоже, боятся XML и намерены использовать функции, основанные на XML, в жестоком беспорядке, который это HTML. XHTML решил эти проблемы много лет назад.

20
задан carterw485 14 August 2015 в 07:28
поделиться

4 ответа

Firebase не поддерживает запросы с динамическим параметром, например «два часа назад». Он может выполнять запрос для определенного значения, например «после 14 августа 2015 года, 7:27:32 утра».

Это означает, что вы можете запустить фрагмент код периодически, чтобы очистить элементы, которые старше 2 часов в это время :

var ref = firebase.database().ref('/path/to/items/');
var now = Date.now();
var cutoff = now - 2 * 60 * 60 * 1000;
var old = ref.orderByChild('timestamp').endAt(cutoff).limitToLast(1);
var listener = old.on('child_added', function(snapshot) {
    snapshot.ref.remove();
});

Как вы заметите, я использую child_added вместо value и I limitToLast(1). Когда я удаляю каждого дочернего объекта, Firebase запускает child_added для нового «последнего» элемента до тех пор, пока после точки отсечения больше нет элементов.

Обновление: если вы хотите запустить этот код в облачных функциях для Firebase:

exports.deleteOldItems = functions.database.ref('/path/to/items/{pushId}')
.onWrite((change, context) => {
  var ref = change.after.ref.parent; // reference to the items
  var now = Date.now();
  var cutoff = now - 2 * 60 * 60 * 1000;
  var oldItemsQuery = ref.orderByChild('timestamp').endAt(cutoff);
  return oldItemsQuery.once('value', function(snapshot) {
    // create a map with all children that need to be removed
    var updates = {};
    snapshot.forEach(function(child) {
      updates[child.key] = null
    });
    // execute all updates in one go and return the result to end the function
    return ref.update(updates);
  });
});

Эта функция запускается всякий раз, когда данные записываются в /path/to/items, поэтому дочерние узлы будут удаляться только при изменении данных.

Этот код теперь также доступный в functions-samples репо .

26
ответ дан Frank van Puffelen 17 August 2018 в 09:43
поделиться
  • 1
    В вашем примере вы получаете записи, сохраненные 2 часа назад или меньше. Возможно, вы должны использовать endAt вместо startAt. Но все равно спасибо за ваш ответ, это помогло мне – Crema 17 May 2016 в 07:03
  • 2
    Хороший улов! Исправлена. – Frank van Puffelen 17 May 2016 в 09:55
  • 3
    Привет, Франк, я пытаюсь сделать что-то подобное в Swift, но я не могу понять, какой метод вы вызываете в слушателе. Я потратил несколько часов на поиск и попытку, но решил, что пришло время попросить о помощи! – Abhi 16 September 2016 в 07:46
  • 4
    snapshot.ref().remove() в Swift с SDK 3.x будет snapshot.ref.removeValue(). См. Руководство guide и reference . – Frank van Puffelen 16 September 2016 в 16:51
  • 5
    Когда я осуществил это, все данные были удалены через 1 секунду вместо 2 часов. Я скопировал и вставлял именно код, так что я не делаю, что происходит? – Dani Kemper 18 September 2017 в 19:13

Вы можете посмотреть Планирование функций Firebase с помощью заданий Cron . Эта ссылка показывает вам, как планировать облачную функцию Firebase для работы с фиксированной скоростью. В запланированной функции Firebase вы можете использовать другие ответы в этом потоке для запроса старых данных и удаления.

2
ответ дан James Oliver 17 August 2018 в 09:43
поделиться

В последней версии Firebase API ref () изменен на ref

var ref = new Firebase('https://yours.firebaseio.com/path/to/items/');
var now = Date.now();
var cutoff = now - 2 * 60 * 60 * 1000;
var old = ref.orderByChild('timestamp').endAt(cutoff).limitToLast(1);
var listener = old.on('child_added', function(snapshot) {
    snapshot.ref.remove();
});
5
ответ дан Won Jun Bae 17 August 2018 в 09:43
поделиться
0
ответ дан Sergio 6 September 2018 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: