2016-11-06 71 views
0

我试图开发一个使用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)依赖于其他孩子?(每个停车位)在火力基地?

回答

0

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

  • 而是在数据库中一个接一个用相同的代码(复制粘贴或不订阅每一个fparkingX节点,仍闻起来),直接订阅他们的父母。
    价值和儿童事件听众都在这里工作,尽管需要一点点不同的想法。
  • 从数据库中消除freeSlots节点。
  • 计算客户端代码中的空闲插槽数。
    通过一个值监听器,您可以在一个快照中获得所有停车节点,因此迭代孩子并计算它们非常简单。 有了一个孩子监听器,你必须保存一个局部整数,并在孩子事件到达时递增/递减 - 一旦你掌握了这个想法,再次很简单。
+0

我有不同的片段,依赖于数据库中的每个fparkingX节点,所以我订阅了他们一个一个。感谢您的回复!如果可以的话,你能证明通过孩子的迭代吗?如果你可以提供一个样品,会非常感激。再次感谢! – Miho

+0

就我个人而言,我认为碎片不是去这里的路。 RecyclerView会给你更好的性能和内存使用。 'FirebaseRecyclerAdapter'使设置变得非常简单。无论如何,我会在稍后添加一个例子。 – vzsg