Как получить только обновленные данные из Firebase? [Дубликат]

используете ли вы конфигурацию SMTP для отправки своей электронной почты? попробуйте вместо этого использовать phpmailer. вы можете загрузить библиотеку из https://github.com/PHPMailer/PHPMailer . Я создал электронную почту, отправив этот путь:

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet="utf-8";
    $mail->IsSMTP();                                      // set mailer to use SMTP
    $mail->Host = "mail.example.com";  // specify main and backup server
    $mail->SMTPAuth = true;     // turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "p@ssw0rd"; // SMTP password

    $mail->From = "me@walalang.com";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // set word wrap to 50 characters
    $mail->IsHTML(true);                                  // set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";    
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. 

"; echo "Mailer Error: " . $mail->ErrorInfo; exit; } echo "Message has been sent"; }

6
задан Frank van Puffelen 27 March 2016 в 18:15
поделиться

2 ответа

Каждый раз, когда создается действие onChildAdded, вызывается для всех данных в ссылке. Возможно ли, чтобы onChildAdded и onChildRemoved вызывались только для «diff» между моим локальным кешем и данными на сервере firebase?

Нет, это невозможно. Из документации по типам событий :

child_added запускается один раз для каждого существующего дочернего элемента, а затем снова каждый раз, когда новый ребенок добавляется к указанному пути

Теперь вернемся к вашему первоначальному вопросу:

, какой обратный вызов мне нужно использовать, чтобы он запускался только для 5 новых элементов, которые были добавлены?

Это будет:

ref.limitToLast(5)...

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

более обычное решение - отслеживать последний элемент, который вы уже видели, а затем использовать startAt(), чтобы начать стрельбу с того места, где вы были в последний раз:

ref.orderByKey().startAt("-Ksakjhds32139")...

Затем вы сохранили бы последний ключ вы видели в общих предпочтениях.

Аналогичным образом вы можете сохранить последний раз, когда активность была видна с помощью:

long lastActive = new Date().getTime();

Затем добавьте timestamp с Firebase.ServerValue.TIMESTAMP к каждому элементу, а затем:

ref.orderByChild("timetstamp").startAt(lastActive+1)...
10
ответ дан Frank van Puffelen 21 August 2018 в 07:31
поделиться
  • 1
    Будет ли это решение также запускать события childChanged и childRemoved? – Vinay Nagaraj 19 January 2016 в 13:11
  • 2
    Хотя ответ Фрэнка АБСОЛЮТНО ПРАВИЛЬНО, я думаю, вы должны пересмотреть логику, чтобы обрабатывать CREATE, UPDATE и DELETE (на основе действий, которые он предлагает). Мне кажется, что вы можете рассмотреть журнал FIFO на основе Firebase действий C (R) UD (с логикой истечения / выселения), чтобы поймать все, что произошло, когда разные устройства были автономными. – seanpj 19 January 2016 в 13:12
  • 3
    Да, FIFO событий, поскольку последний запрос был бы оптимальным, но похоже, что я буду использовать childEventListener как есть. При захвате событий я проигнорирую данные, которые уже были замечены путем их локального хранения. – Vinay Nagaraj 19 January 2016 в 13:54
  • 4
    Что относительно удаленных элементов в автономном режиме? – seanpj 19 January 2016 в 14:33
  • 5
    Я не уверен, как, но похоже, что onChildRemoved срабатывает правильно. Я убиваю все процессы на моем телефоне Android (приложение больше не должно слушать firebase), удалите элемент из списка с помощью панели инструментов приложения firebase, запустите приложение на своем телефоне и перейдите к соответствующему действию. Элемент, который я удалил, появляется на секунду, прежде чем исчезнуть из списка. Я в порядке с этим поведением, потому что данные будут удалены очень редко из этого конкретного списка, RC & amp; U - основные варианты использования. Я думаю, я должен написать некоторые обширные тесты, хотя действительно понять, что происходит – Vinay Nagaraj 19 January 2016 в 16:43

Вы должны использовать on ('child_changed') . Обычно on() используется для прослушивания изменений данных в определенном месте. Однако on('child_changed') уведомляет вас

, когда данные, хранящиеся у ребенка ( или любого из его потомков ) изменяются.

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

1
ответ дан not_a_bot 21 August 2018 в 07:31
поделиться
  • 1
    Разве он в этом случае не получит список из 50000 + 5 предметов, которые он не просит (см. Последний параграф вопроса). – seanpj 18 January 2016 в 11:35
  • 2
    Вы правы, я полагаю, что он мог бы использовать limitToLast (x) , чтобы получить последних X обновленных детей. – not_a_bot 19 January 2016 в 00:33
Другие вопросы по тегам:

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