0

Firebase database에는 2 명의 자식이 Child1, Child2를 허용했습니다. 어린이 1은 사용자의 프로필 정보가 Root/Child1/Uid-User(x)/User_details입니다. Child2에는 사용자가 수행 한 거래가 Root/Child2/Uid-User(x)/Transaction_details으로 표시됩니다. 한 사용자의 사용자 프로필 정보를 검색 한 다음 동일한 사용자의 트랜잭션을 가져 와서 일부 개체에 저장하려고합니다. 그런 다음 다른 사용자의 프로필 정보, 거래 내역을 다른 사용자에게 저장하는 등의 작업을 수행합니다. 어떻게하면됩니까?은 Firebase 메소드가 비동기 적으로 실행될 때 하나의 메소드를 Child1에서 그리고 다른 하나는 Child2에서 검색하면 비동기 적으로 실행되어 문제가 발생합니다.Firebase의 메소드를 동기화하는 방법

당신이 다시 다른 요청이 자신의 transction 데이터

를 가져 오지 수 있도록하거나 모두 개별적으로 검색 후 검색된 데이터가 널 안 보장 완료되면 userDetail 노드에 리스너를 넣어 그것을 처음 검색 할 수 있습니다

답변

0

및 결과를 2 개의 HashMap에 넣는다. 두 리스너에서 가져온 데이터를 키에 따라 합칠 수있다. (두 맵의 길이가 같아야한다.)

두 청취자가 모두 호출되도록한다.

처음에는 두 개의 변수를 넣습니다.

userProfileHit = 0; 
userTransctionHit = 0; 
privte void userList() { 
userProfileHit ++; 
private ValueEventListener userListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     //retriveData 
     userProfileHit --; 
     doMergingTask(); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     userProfileHit --; 
     doMergingTask() 
    } 
}; 
} 
private void transctionList() { 
userTransctionHit ++; 
private ValueEventListener transctionListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     userTransctioneHit --; 
     doMergingTask() 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     userTransctionHit --; 
     doMergingTask() 
    } 
}; 
} 
private void doMergingTask() { 
    if (userTransctionHit == 0 && userProfileHit == 0) { 
     // Check Datas are valid and merge it 
    } 
} 
+0

고장이 방법을 이끌 것이다 다를 수 있으므로 취득에서는 두개의 엔트리 수를 하나 이상의 트랜잭션을 수행 할 수있는 사용자. –

0

제 제안은 onDataChanged 프로필 정보를 검색하는 방법에 사용자 트랜잭션을 검색하는 방법을 사용하는 것입니다. 따라서 사용자 프로필 정보를 얻으면이를 사용하여 사용자의 트랜잭션 정보를 얻고 개체를 만듭니다. Firebase 이벤트 리스너를 중첩시켜 원하는 결과를 얻을 수 있습니다. 예

:

final FirebaseDatabase database = FirebaseDatabase.getInstance(); 
final DatabaseReference ref = database.child("profile"); 

// Attach the first listener to read the data at our profile reference 
ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     final Profile profile = dataSnapshot.getValue(Profile.class); 

     DatabaseReference transactionRef = database.child("transaction"); 

     // Attach a listener to read the data at our transactions reference 
     transactionRef.addValueEventListener(new ValueEventListener() { 

     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
     Transaction transaction = dataSnapshot.getValue(Transaction.class); 
     // 
     //Do stuff with the Transaction object and Profile object here. 
     // 


     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      System.out.println("The read failed: " + databaseError.getCode()); 
     } 
     }); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     System.out.println("The read failed: " + databaseError.getCode()); 
    } 
}); 
+0

@ T double, 메서드를 반복적으로 호출해야하므로 두 번째 호출이 메서드에 대한 첫 번째 호출 완료 전에 시작되므로 문제가 발생합니다. –

+0

예, 이해합니다. 두 번째 호출이 첫 번째 호출의 onDataChanged 메소드 안에 있지 않기 때문에 두 번째 호출은 메소드에 대한 첫 번째 호출 완료 전에 시작됩니다 ... 그 firebase는 활동 위협과 다른 트레드에서 데이터를 반환합니다. 데이터와 관련된 작업은 onDataChanged 메소드 내에서만 수행되어야합니다. onbaseChanged 메서드 밖에서 firebase의 데이터를 사용하려고 시도하면 nullpointerexception이 발생합니다. 내 대답에 대한 예를 추가했습니다. 나는 그것이 도움이되기를 바랍니다 –

+0

도움을 주셔서 감사합니다 @T double –