После документации firebase .update все еще перезаписывается

Я думаю, что вторая часть вопроса:

Кроме того, для чего используются побитовые операторы? Я был бы признателен за некоторые примеры.

Был только частично рассмотрен. Это мои два цента по этому вопросу.

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

Во всех приложениях, которые должны отправлять данные между двумя узлами, такими как:

  • компьютерные сети;
  • телекоммуникационные приложения (сотовые телефоны, спутниковая связь , и т. д.).

На уровне связи нижнего уровня данные обычно отправляются в так называемых кадрах. Фреймы - это просто строки байтов, которые отправляются через физический канал. Эти кадры обычно содержат фактические данные плюс некоторые другие поля (закодированные в байтах), которые являются частью того, что называется заголовком. Заголовок обычно содержит байты, которые кодируют некоторую информацию, связанную с состоянием связи (например, с флагами (битами)), счетчики кадров, коды коррекции и обнаружения ошибок и т. Д. Чтобы получить переданные данные в кадре и построить кадры для отправки данных, вам понадобятся наверняка побитовые операции.

В общем, при работе с такими приложениями API доступен, поэтому вам не нужно разбираться со всеми этими деталями. Например, все современные языки программирования предоставляют библиотеки для соединений сокетов, поэтому на самом деле вам не нужно создавать кадры связи TCP / IP. Но подумайте о хороших людях, которые запрограммировали эти API для вас, им наверняка пришлось иметь дело с рамочной конструкцией; используя все виды побитовых операций для перехода от низкоуровневой связи к высокоуровневой связи.

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

Еще одна очень различное семейство приложений низкого уровня - это когда вам нужно управлять оборудованием, используя некоторые (древние) порты, такие как параллельные и последовательные порты. Эти порты управляются путем установки некоторых байтов, и каждый бит этих байтов имеет конкретное значение с точки зрения инструкций для этого порта (см., Например, http://en.wikipedia.org/wiki/Parallel_port ). Если вы хотите создать программное обеспечение, которое что-то делает с этим оборудованием, вам понадобятся побитовые операции для перевода инструкций, которые вы хотите выполнить, в байты, которые порт понимает.

Например, если у вас есть некоторые физические кнопки, подключенные к параллельному порту для управления другим устройством, это строка кода, которую вы можете найти в мягком приложении:

read = ((read ^ 0x80) >> 4) & 0x0f; 

Надеюсь, что это поможет.

0
задан Frank van Puffelen 13 July 2018 в 14:47
поделиться

1 ответ

Чтобы получить то, что вам нужно, вам нужно запустить это обновление:

var ref = firebase.database.ref("zzACGAFCG");
ref.update({ "-LH9-nBF6Wx3g6oSq154": "-LHFN0BZ2FNWUExOnulR^NA" });

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


Самое важное, что нужно понять, это то, что инструкция обновления перебирает все ключи / пути в объекте, который вы предоставляете и, по существу, выполняет операцию set для каждого из них.

Скажите, что у вас есть следующий JSON:

{
  "root": {
    "messages": {
      "message1": "blablabla",
      "message2": "blablabla"
    }
  }
}

Если вы запустите это заявление об обновлении:

var root = firebase.database().ref("root");
root.update({ messages: { message3: "new message" } });

Затем весь узел /root/messages будет заменен обновлением, поэтому результат будет:

{
  "root": {
    "messages": {
      "message3": "new message"
    }
  }
}

Как я уже говорил, за пределами первого уровня ключей / путей в ваших объектах обновления , база данных выполняет операцию set(). Это не делает глубокое слияние.

Если вы хотите исправить узел на более низком уровне, вам необходимо убедиться, что у вас есть весь путь к свойству, которое вы хотите обновить в ключе обновить объект. Итак:

root.update({ "messages/message3": "new message" });

приведет к:

{
  "root": {
    "messages": {
      "message1": "blablabla",
      "message2": "blablabla",
      "message3": "new message"
    }
  }
}
1
ответ дан Frank van Puffelen 17 August 2018 в 12:35
поделиться
  • 1
    это именно то, как я это пробовал - см. второй блок кода в моем сообщении. Я должен установить его как obj [key] = data, потому что для меня нет возможности написать pushID, поскольку строка ключа устанавливается во время выполнения. Объект оценивается идентично тому, что у вас есть в вашем коде, что подтверждается тем, что показывает console.log в firebase. Что еще более странно, так это то, что он не переписывает весь узел. Чтобы использовать ваш пример с сообщениями, он переписывает message1 с сообщением3, но остается сообщение2 все еще там. Я понимаю, как работает функция .update - она ​​не работает правильно – OctoInfinitus 13 July 2018 в 17:10
  • 2
    Мне сложно анализировать код в вашем вопросе, поэтому я пошел с упрощенным примером в своем ответе. Посмотрите, можете ли вы воспроизвести его с жестко заданными значениями, например. PushIDSnapVal. Если можно, настройте что-то вроде jsbin, который воспроизводит его, и я посмотрю. – Frank van Puffelen 13 July 2018 в 17:46
  • 3
    хорошо спасибо, я должен уйти из города и, вероятно, не смогу ничего сделать до вторника или среды следующей недели. В основном я вытаскиваю pushID из другого места в базе данных и устанавливаю его как ключ под другим родителем с присвоенным ему строковым значением. (В этом случае строка является еще одним pushID, поэтому она, вероятно, выглядит немного запутанной.) Возможно, есть лучший способ ее настроить. Я сделал .update, используя выписанную форму типа .update ({& quot; ключ & quot; & quot; значение & quot;}), и он всегда работал отлично, поэтому я не понимаю, почему передача объекта не работает – OctoInfinitus 13 July 2018 в 18:57
  • 4
    Как я сказал и показал: скорее всего, вам нужно потянуть часть объекта в свой ключ. Но код, который вы поделили, выглядит отлично. Дайте мне знать, как только вы настроите репродукцию, и я посмотрю. – Frank van Puffelen 13 July 2018 в 19:26
  • 5
    Я воспроизвел его, используя жестко закодированные строки для переменных pushIDSnapVal и Data. Это делается точно так же, как когда я извлекал информацию с помощью функций .once и .val. Вот ссылка на jsbin кода, используемого при его воспроизведении: jsbin.com/hedarif/edit?html,js,output – OctoInfinitus 18 July 2018 в 18:35
Другие вопросы по тегам:

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