Unix: путание использования Мишени - команда

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

Руководство по Firebase Чтение и усиление. Запись данных показывает четыре типа объектов, которые могут быть записаны; Строка, число, словарь, массив.

Одно из решений - встроить в класс функцию, которая возвращает данные, которые вы хотите записать.

public class Parent {
    var phoneNumber: String?
    var familyKey: String?
    var geofences: [GeofenceData]?

    init() {
        self.phoneNumber = ""
        self.familyKey = ""
        self.geofences = nil
    }

    //other init functions

    func getParentDict() -> [String: Any] {

        let geoDict = ["name": name,
                       "latitude": latitude,
                       "longitude": longitude,
                       "radius": radius
        ]

        let zeroNode = ["0": geoDict]

        let dictForFirebase: [String: Any] = [
            "phoneNumber": phoneNumber,
            "familyKey": familyKey,
            "geofences": zeroNode
        ]

        return dictForFirebase
    }
}

и на практике

var tempGeofences = [GeofenceData]()
tempGeofences.append(GeofenceData(name: "Hello WOrld", latitude: 0, longitude: 0, radius: 1000))

let familyKey:String = String(Int.random(in: 1000...99999))
let uid:String = Auth.auth().currentUser!.uid
let phoneNumber = "1111111111"
let parent = Parent(phoneNumber: phoneNumber, familyKey: familyKey, geofences: tempGeofences)
let parentDict = parent.getParentDict
databaseRef.child(uid).setValue(parentDict)

Однако, одной проблемой является дочерний узел с «0» в качестве ключа. Похоже, вы можете использовать массив. Если есть хорошая причина, это хорошо, но обычно есть гораздо лучшие альтернативы использованию массивов в базах данных NoSQL. См. Устаревшую, но все еще точную публикацию Firebase под названием Arrays Are Evil

РЕДАКТИРОВАТЬ:

За комментарий / вопрос «Как добавить еще один дочерний узел после узла "0" "

Предположим, мы знаем, что родительский узел qSaEE ... позволяет добавить узел" 1 "

let parentNode = "qSaEE..."
let geofenceRef = firebaseRef.child(parentNode).child("geofences")

let geoDict = ["name": name,
               "latitude": latitude,
               "longitude": longitude,
               "radius": radius
               ]

let oneNode = ["1": geoDict]

geofenceNode.setValue(oneNode)

14
задан Léo Léopold Hertz 준영 24 August 2009 в 17:09
поделиться

6 ответов

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

echo "foo bar" | sudo tee -a /path/to/some/file

, «foo bar» будет отображаться в стандартный вывод , а добавляется в / path / to / some / file . Думайте о тройнике как о соединении «Т» в трубе, разделяя выход на две другие трубы.

36
ответ дан 1 December 2019 в 05:54
поделиться

tee копирует stdin в stdout (например, cat ) и дополнительно записывает все в указанный файл. Использование его таким образом с sudo позволяет передавать информацию в привилегированный режим и, в то же время, отслеживать, попали ли туда нужные данные.

Также обратите внимание, что из-за того, как перенаправление обрабатывается в оболочке, почти эквивалент

sudo echo "foo bar" > /path/to/some/file

не будет работать, поскольку перенаправление будет выполняться вызывающим пользователем, а не целевой sudo . Пользователь.

12
ответ дан 1 December 2019 в 05:54
поделиться

Помните, что цель tee не ограничивается обычными файлами, но может быть устройствами, FIFO и т. Д. Кроме того, вы можете передавать по трубопроводу на другой вызов tee и т. Д. на. : -)

2
ответ дан 1 December 2019 в 05:54
поделиться

I find that the tee command is very useful in debugging shell scripts that contain long pipelines. This is the tail-end of a ghastly shell script that is a decade overdue for a rewrite in Perl, but it still works. (It was last modified in 1998, as it happens.)

# If $DEBUG is yes, record the intermediate results.
if [ "$DEBUG" = yes ]
then
    cp $tmp.1 tmp.1
    cp $tmp.2 tmp.2
    cp $tmp.3 tmp.3
    tee4="| tee tmp.4"
    tee5="| tee tmp.5"
    tee6="| tee tmp.6"
    tee7="| tee tmp.7"
fi

# The evals are there in case $DEBUG was yes.
# The hieroglyphs on the shell line pass on any control arguments
# (like -x) to the sub-shell if they are set for the parent shell.
for file in $*
do
    eval sed -f $tmp.1 $file                $tee4 |
    eval sed -f $tmp.3                      $tee5 |
    eval sh ${-+"-$-"}                      $tee6 |
    eval sed -f $tmp.2                      $tee7 |
    sed  -e '1s/^[  ]*$/--@/' -e '/^--@/d'
done

The three sed scripts that are run are ghastly - I don't plan to show them. This is also a semi-decent use of eval. The normal temporary file names ($tmp.1, etc) are preserved by a fixed name (tmp.1, etc), and the intermediate results are preserved in tmp.4 .. tmp.7. If I were updating the command, it would use '"$@#"' instead of '$*' as shown. And, when I'm debugging it, then there is but one file in the argument list, so the trampling of the debug files is not an issue for me.

Note that if you need to do so, you can create several copies of the input at one time; there is no need to feed one tee command into another.

If anyone needs it, I have a variant of tee called tpipe which sends copies of the output to multiple pipelines instead of multiple files. It keeps going even if one of the pipelines (or standard output) terminates early. (See my profile for contact info.)

1
ответ дан 1 December 2019 в 05:54
поделиться

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

В этом случае вы показываете, что tee называется суперпользователем (через sudo), и его единственная цель - записать файл как суперпользователь вместо пользователя, который выполняет эхо.

0
ответ дан 1 December 2019 в 05:54
поделиться

Пояснения к случаям

1. повышение разрешений с помощью команд sudo- и -tee

Этот пример касается не просто логики, а скорее соглашения. В нем показано соглашение об эскалации разрешений:

echo "Body of file..." | sudo tee root_owned_file > /dev/null

В этом примере показано, как тройник используется для обойти внутреннее ограничение в команда sudo. sudo не может передавать стандартный вывод в файл. По выгружая свой поток stdout в / dev / null, мы также подавляем зеркальный вывод в консоли.

2. запуск sudo-команд с Vim

Поскольку вы можете использовать Sudo-команды с Vim, вы можете использовать эту команду, если вы забыли запустить ее как sudo. Это полезно в таких местах, как /etc/init.d/, где вы найдете файлы только для чтения.

Логика с командой tee

Это похоже на ветку в Git, или лучше, пожалуйста, см. Т-аналогия Рика Коупленда . Надеюсь, модифицированный пример (оригинал) поможет понять его использование:

curl "http://en.wikipedia.org/wiki/Pipeline_(Unix)" | tee original_site | sed 's/[^a-zA-Z ]/ /g' | tr 'A-Z ' 'a-z\n' | grep '[a-z]' | sort -u | comm -23 - /usr/share/dict/words
4
ответ дан 1 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

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