2016-10-21 3 views
0

Как обновить eImageUrl у существующего сотрудника? Узел Я пытаюсь получить доступ выглядит следующим образом:Как обновить определенный узел в Firebase?

Employees 
    KTpWLCrQTTSfQnTCn5w 
    eId : "1000" 
    deptId : "10" 
    eImageUrl "" 
    KTqWLCrVVTMfQsTCw6n 
    eId : "1001" 
    deptId : "10" 
    eImageUrl "" 

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

У меня есть eId для сотрудника, которого я хочу обновить. Я попытался следующие:

databaseRef.child("Employees").child("10001").setValue(["eImageUrl": eImageUrl]) 

но создает другой узел под сотрудников:

Employees 
    KTpAQCrYIBSfQxTCn2w 
    eImageUrl "https://firebasestorage.googleapis.com/c0/myapp.com/a/employee.jpg" 

ответ

3

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

Так что в этом случае я бы подумал о хранении сотрудников под их идентификатором сотрудника.

Employees 
    "eId_1000" 
    deptId : "10" 
    eImageUrl "" 
    "eId_1001" 
    deptId : "10" 
    eImageUrl "" 

Я дал сотруднику Идентификаторы буквенно-цифровой префикс, который гарантирует, что клиент Firebase не будет пытаться интерпретировать их как массив.

С этой структурой на месте, вы можете изменить запись о сотруднике с updateChildValues():

databaseRef.child("Employees").child("eId_10001").updateChildValues(["eImageUrl": eImageUrl]) 

Или позвоните setValue() один уровень ниже в дереве:

databaseRef.child("Employees/eId_10001/eImageUrl").setValue(eImageUrl) 

Update

Поскольку вы указываете, что хотите придерживаться текущей структуры данных, этот запрос будет работать для этого:

let employees = databaseRef.child("Employees") 
let query = employees.queryOrdered(byChild: "eId").queryEqual(toValue: "1000") 
query.observe(.childAdded, with: { (snapshot) in 
    snapshot.ref.updateChildValues(["eImageUrl": eImageUrl]) 
}) 
+0

Я предпочел бы не делать, потому что тогда вы должны убедиться, что ID Безразлично» t уже существуют. Случайный идентификатор лучше, но лучше, если Firebase создает его. – 4thSpace

+0

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

+0

Спасибо. Я собираюсь использовать то, что вы предложили, и позволить автогенерированным идентификаторам сотрудников (Firebase) быть корнем каждого узла вместо некоторого автоматически созданного несвязанного идентификатора. – 4thSpace

1

Вы должны получить pushid первым выполнить обновление базы данных

databaseRef.child('Employees').orderByChild('eId').equalTo(1001).on('value',function(snapshot){ 

snapshot.forEach(function(data) { 

    databaseRef.child("Employees/"+data.key+"/eImageUrl").set(eImageUrl); 

           }); }); 

Надеется, что это помогло

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