2016-11-06 96 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