如何同步Firebase的方法

时间:2017-05-17 11:00:18

标签: android database firebase firebase-realtime-database thread-synchronization

在我的Firebase database中,我有两个孩子让Child1,Child2。 Child1 包含用户的个人资料信息Root/Child1/Uid-User(x)/User_details Child2 包含用户以Root/Child2/Uid-User(x)/Transaction_details完成的交易。我想检索一个用户的用户配置文件信息,然后检索同一用户的事务,然后将其存储在某个对象中。然后分析另一个用户的信息,他的交易并将其存储在另一个对象中,依此类推。 我该怎么做?因为Firebase方法异步运行所以如果我创建一个方法从Child1检索另一个方法用于Child2,那么它们会异步执行并产生问题。

2 个答案:

答案 0 :(得分:0)

您可以检索它最初通过将监听器放入userDetail节点完成此操作后,请确保在再次请求检索其转换数据后,检索到的数据不应为null

或者您分别检索两者并将结果放入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
    }
}

答案 1 :(得分: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());
    }
});