2016-09-15 3 views
0

MutableData를 사용하여 Firebase Realtime Database 트랜잭션의 목록에 어떻게 추가 할 수 있습니까?Firebase Realtime Database MutableData에 목록에 추가

정상이 아닌 거래 유형 업데이트에서

, 단순히

DatabaseReference refDatabase = ...  
refDatabase.push().setValue(value); 

그러나 MutableData와

는, 그러한 푸시() 메소드가 존재하지 않는 사용할 수 있습니다. 목록에 추가하고 고유 키를 얻는 방법?

나는

public Transaction.Result doTransaction(MutableData mutableData) { 
     mutableData.push().setValue(value); 
     ... 

처럼 뭔가를 찾고 있어요하지만이 존재하지 않습니다.

+0

'push()'를 호출하는 것은 순수한 클라이언트 측 연산이다. 당신은'refDatabase.push(). getKey()'를 호출하고 코드의 어느 곳에서나 유일한 키를 얻을 수 있습니다. 트랜잭션을 처리하는 데 문제가 있으면 [해당 문제를 재현하는 최소 코드] (http://stackoverflow.com/help/mcve)를 표시하십시오. –

+0

감사합니다. @Frank van Puffelen, 고유 키 문제를 해결하지만 MutableData를 사용하여 목록에 추가하는 방법을 보여주지 않습니다. 분명히 물었습니다. 내가 필요로하는 방법이 존재하지 않는다는 것을 보여줌으로써 문제를 재현 할 수있는 최소한의 코드를 제공하는 것은 그리 많지 않습니다. – aez

답변

1

나는 귀하의 질문과 의견의 요점을 이해하고 있다고 생각합니다 : push() 부재는 API 디자이너의 감독 이었는지 또는 사용자가 안전하지 않은 작업을하지 못하도록 의도적으로 생략되었거나 그렇지 않으면 "나쁘다".

해결 방법이 있습니다. 맞습니까? 트랜잭션이 실행되는 참조를 알고 있습니다. 변경 가능한 데이터는 해당 참조 위치의 값입니다. 참조 변수를 패키지 필드 또는 final 클래스 변수로 만들고 콜백에 사용하여 push()을 호출 할 수 없습니까? 못 생겼지 만 일해야한다고 생각합니다.

push()이 이유 때문에 MutableData에서 생략되었다고 생각합니다. documentation for doTransaction() 주 :이 메소드는이 위치에서 현재 데이터, 아마도 여러 번 호출됩니다

. 해당 데이터를 검사하고 이 원하는 새 데이터 을 지정하거나 트랜잭션을 중단해야하는 Transaction.Result를 반환합니다.

이 메서드는 동일한 트랜잭션에 대해 반복적으로 호출 될 수 있으므로 은이 메서드로 트리거 될 수있는 부작용을 매우 조심해야합니다.

키를 생성하고 목록에 요소를 추가하는 것은 여러 번 발생할 수 있으므로 수행하고 싶은 작업이 아닐 수 있습니다.

관련 문제