从firebase数据库中获取多个值

时间:2018-04-23 14:30:58

标签: android firebase firebase-realtime-database android-asynctask

在我们的数据库结构中,每个“用户”拥有多个出价ID,每个出价-Id代表“作业”数据库中的入口点。
目前,当我们想要遍历单个人的所有工作时,代码看起来类似于:

final DatabaseReference mDatabaseJobs = FirebaseDatabase.getInstance().getReference().child("Jobs");
        DatabaseReference mDatabaseUser = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUser.getUid());
        mDatabaseUser.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                DataSnapshot userBids = dataSnapshot.child("listOfBids");
                final int num_user_bids = (int) userBids.getChildrenCount();

                for(final DataSnapshot job : userBids.getChildren()){
                    String jobId = job.getValue(String.class);
                    mDatabaseJobs.child(jobId).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            bid_count.addAndGet(1);

这是数据库结构,目标是以某种方式获得特定人员的所有工作。

enter image description here

有没有办法一次检索所有作业? mabye键列表?而不是为每一个调用add-listener?
如果没有,我知道firebase异步获取数据,但它是否并行执行?
即我们当前递增一个原子整数以了解firebase是否已经获取了所有作业,因为我们不希望线程同时递增计数器,是否在我们当前的实现中是必要的? 谢谢!

1 个答案:

答案 0 :(得分:0)

您可以将HashMap保留在"用户"之外,用当前用户的作业列表填充它。然后将另一个听众附加到" Jobs"并遍历您的hashMap并获取您想要的特定作业。以下是参考代码:

HashMap<Integer, String> listOfJobs = new HashMap<>();
DatabaseReference mDatabaseUser = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUser.getUid()).child("listOfBids");

mDatabaseUser.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    if (dataSnapshot.exists) {
        listOfJobs.putAll((Map) dataSnapshot.getValue());
    }
    // Here you can add a listener to the entire "Jobs" reference like this
    DatabaseReference mDatabaseJobs = FirebaseDatabase.getInstance().getReference().child("Jobs");
    mDatabaseJobs.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot userDataSnapshot) {
            if (userDataSnapshot.exists) {
                for (String jobId : listOfJobs.values()) {
                    if (userDataSnapshot.hasChild(jobId) {
                        DataSnapshot job = userSnapshot.child(jobId);
                        // here you can use job snapshot
                        bid_count.addAndGet(1); // something like this?
                    }
                }
            }
        }

});

基本上,您正在为非嵌套或深度的东西添加侦听器,并使用循环来获取子节点,而不是向嵌套子节点添加侦听器。

希望这有帮助。