2016-09-27 5 views
1

Firebase에서 객체를 만들 때 childByAutoId를 사용합니다. 나중에 특정 개체를 어떻게 업데이트 할 수 있습니까? Firebase가 자동으로 업데이트하는 키 값을 얻는 데 문제가 있습니다. Snapshot.key는 "사용자"를 반환합니다. 내 JSON 구조는 다음과 같습니다.Firebase에서 childByAutoId로 값을 업데이트하는 방법은 무엇입니까?

{ 
    "users" : { 
    "-KQaU9lVcUYzIo52LgmN" : { 
     "device" : "e456f740-023e-440a" 
     "name: "Test" 
    } 
    }, 

-KQaU9lVcUYzIo52LgmN 키는 어떻게 얻을 수 있습니까? 장치 하위를 업데이트하고 싶습니다. 여기 내가 지금까지 가지고있는 것이있다. 현재 하나의 자식과 완전히 별도의 스냅 샷을 생성합니다.

self.rootRef.child("users").queryOrdered(byChild: "name").queryEqual(toValue: self.currentUser).observeSingleEvent(of: .value, with: { (snapshot) in 
    let key = self.rootRef.child("users").childByAutoId().key 
    let childValues = ["device": device] 
    self.rootRef.child("users").child(key).updateChildValues(childValues) 

편집 : 장치는 코드에 추가로 설정된 문자열입니다. 이 범위에서 정의되지 않았습니다 (이 질문을 읽기 쉽게하기 위해).

답변

4

Snapshot.key를 얻으면 스냅 샷의 전체 키이기 때문에 "사용자"를 반환합니다. 스냅 샷의 "사용자"내부는 모두 값으로 간주됩니다.

"장치"를 파헤 치기 위해 하위 레이어를 반복해야합니다.

이 시도 :

rootRef.child("users").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
    if let result = snapshot.children.allObjects as? [FIRDataSnapshot] { 
     for child in result { 
      var userKey = child.key as! String 
      if(userKey == userKeyYouWantToUpdateDeviceFor){ 
       rootRef.child("users").child(userKey).child("device").setValue(device) 
      } 
     } 
    } 
}) 

이 코드는 다음 작업을 수행합니다

  1. 이 참조의 스냅 샷을 가져옵니다 (그의 키가 될 것이다 'users').
  2. 모든 자식 (사용자 키)을 가져오고 다른 스냅 샷을 'result'에 할당합니다.
  3. 확인 당신이 원하는 키를 찾을 때까지 한 번에 각 키 하나는 (당신이 키 "-KQaU9lVcUYzIo52LgmN"와 사용자를 보면 예를 들어, 는 당신 게시 귀하의 예제 코드에서 첫 번째 반복에 그것을 발견 할 것이다).
  4. 키를 찾으면 키 내부에있는 장치의 값을 rootRef.child("users").child(userKey).child("device").setValue(device) 키로 설정합니다.

물론 사용자 키를 만들 때 모든 사용자 키를 저장해야합니다.장치에 SharedPreferences를 사용할 수는 있지만, 어떤 이유로 든 제거되면 해당 데이터가 바로 여기에 있습니다. 앱의 내부 저장소에 저장할 수도 있지만 SharedPreferences는 내가 사용하는 것입니다.

희망이 도움이됩니다.

+0

가 완벽하게 일을! 정말 고맙습니다!! 나는 방법이 있다는 것을 알았지 만 나는 그것을 알아낼 수 없었다. 'snapshot.children.allObjects'를 통한 반복은 가고자하는 길 같습니다. – winston

+0

우수함! 다행스럽게 도울 수 있어요. 나는 사람들에게 여기서 물어 봄으로써 똑같은 방식으로 배웠다. ;) – Ryan

1

snapshot

FIRDataSnapshot이 생성 된 위치의 열쇠 특성 key있다.

그리고 당신은 당신이 let key = snapshot.key

childByAutoId().key 전화를 observeSingleEvent(of: .value, with: { (snapshot)...

그래서 대신 let key = self.rootRef.child("users").childByAutoId().key

시도를 호출하여 (스냅 샷) 하나 점점 볼 항상 타임 스탬프를 기반으로 새로운 고유 키를 생성 할 수있는

그게 바로 당신이 원하는 아이를 새로 만들지 않고 새 아이를 만들고있는 이유입니다.

희망의 시간 at works

0

나는 (좀 비슷한) 내 자신의 문제에 라이언의 답변을 적응/저장 중포 기지에 의해 생성 된 AutoID 키를 알고 직접 필요없이 장치 ID를 업데이트하는 방법을 알아 낸 :

reference = Database.database().reference().child("users") 

reference.observeSingleEvent(of: .value, with: { (snapshot) in 
          if let result = snapshot.children.allObjects as? [DataSnapshot] { 
           for child in result { 
            if child.childSnapshot(forPath: "device").value as? String == self.yourDeviceIDVariable { 
             print("### Device exists in Firebase at key = \(child.key)") 
             let childKey = child.key 
             self.reference.child(childKey).child("device").setValue(yourNewDeviceID) 
            } 
           } 
          } 
         }) 
관련 문제