将子值与firebase

时间:2016-11-06 18:19:15

标签: android firebase firebase-realtime-database

我正在尝试使用firebase作为我的数据库来开发停车移动应用程序。

Here is what my firebase database looks like, they are all member of the same parent node

以下是我的代码示例

 public long freeSlots;
 public String fp1status;

 //Firebase database connection declaration
fbase= new Firebase("https://justpark-acdb7.firebaseio.com/Firstfloor/");
final Firebase fbaseFreeSlots=fbase.child("freeSlots");
Firebase firebaseparking1=fbase.child("fparking1");


   //I get the freeSlots value everytime it changes and set my long freeSlots into it
    fbaseFreeSlots.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                freeSlots = dataSnapshot.getValue(Long.class);

        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

   //everytime a parking slot gets freed or occupied, i set my freeSlots child, into either +1 or -1 depending on the action of the user.
    firebaseparking1.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            fp1status = dataSnapshot.getValue(String.class);
            if (fp1status.equals("Occupied")) {
                Fragment fp1;
                fp1 = new occupiedFragment();
                FragmentManager fm = getFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                ft.replace(R.id.fparking1, fp1);
                ft.commit();
                if(freeSlots>0) {
                    freeSlots = freeSlots - 1;
                    fbaseFreeSlots.setValue(freeSlots);
                }

            } else if (fp1status.equals("Free")) {
                Fragment fp1;
                fp1 = new freeFragment();
                FragmentManager fm = getFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                ft.replace(R.id.fparking1, fp1);
                ft.commit();
                if(freeSlots<28) {
                    freeSlots = freeSlots + 1;
                    fbaseFreeSlots.setValue(freeSlots);
                }
            }

        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

它正在工作,但价值似乎搞乱,我有firebaseparking(最多28),它看起来一样,所以我不会上传它,以避免长代码。我的代码有什么问题吗?或者是否有可能将孩子的数据(freeSlots)依赖于其他孩子?(每个停车位)在火场?

1 个答案:

答案 0 :(得分:0)

无法自动计算数据库端的值,因此您需要寻找替代解决方案。这是一个可以清理应用程序中所有重复代码的想法:

  • 不是使用相同的代码逐个订阅数据库中的每个fparkingX节点(复制粘贴或不复制,仍然闻起来),而是直接订阅他们的父级。
    价值观和儿童事件听众都在这里工作,虽然需要一点思考。
  • 从数据库中删除freeSlots节点。
  • 计算客户端代码中的空闲插槽数 使用值监听器,您可以在一个快照中获得所有停放节点,因此迭代子节点并对它们进行计数非常简单。 使用子监听器,您必须在子事件到达时保留一个局部整数并递增/递减 - 再次,一旦您掌握了这个想法,就会非常简单。
相关问题