2017-01-24 54 views
0

我的火力數據庫具有以下結構:的Android - 火力地堡多對多的關係孩子聽衆

tasks 
    - task_key_1:{ 
     - name: "task 1" 
     - ... 
     - users{ 
      user_key_1 : true 
     } 
    } 

users 
    - user_key_1{ 
     tasks{ 
      task_key_1 : true 
     } 
    } 

現在,我想在活動中顯示的用戶的任務列表。我發現這個方法,它的工作:

myTasks.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { 

      taskReference.child(dataSnapshot.getKey()).addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        ... 
        } 
       } 
       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        Log.e(TAG, databaseError.toString()); 
       } 
      }); 
     } 

     public void onChildRemoved(DataSnapshot dataSnapshot) { 
      taskReference.child(dataSnapshot.getKey()).addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot taskSnapshot) { 
        ...... 
       } 
       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        Log.e(TAG, databaseError.toString()); 
       } 
      }); 

     } 

     public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) { 
     taskReference.child(dataSnapshot.getKey()).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot taskSnapshot) { 
       Log.w(TAG, "on child changed") 
      } 
      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.e(TAG, databaseError.toString()); 
      } 
     }); 

      }); 
     } 

     public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) { 
      Log.w(TAG, "onChildMoved"); 
     } 

     @Override 
     public void onCancelled(DatabaseError error) {} 

    }); 

其中: mytasks是/用戶/用戶名/任務 參考,taskReference是/任務/ taskKeyOwnedByUser。

我的問題是:如何檢測對任務的更改,即用戶何時更改其標題,然後更新列表UI?看起來OnChildChanged中的「Log.w」永遠不會被調用。

預先感謝您

回答

0

這是我的做法,改變users/<usersId>/tasks/<taskId>值類型爲時間戳值。然後,當您即將更新任務時,請務必更新時間戳,以便觸發onChildChanged

這是你的數據庫結構將是

users { 
    - user_key_1 { 
     tasks { 
      task_key_1 : ServerValue.TIMESTAMP (Long value) 
     } 
    } 
} 

,這是一個實例方法,當你即將更新任務的名稱

Map<String, Object> values = new HashMap<>(); 
values.put("tasks/" + task_key + "/name", new_task_name); 
values.put("users/" + user_key + "/tasks/" + task_key, ServerValue.TIMESTAMP); 
ref.updateChildren(values); 

採用這種方法,在onChildChanged將被解僱。 希望這有助於:)

+0

謝謝,我會試試看。我想知道,也許有一種方法可以使用由firebase創建的「標準」鍵來完成此操作,而無需對其進行自定義。 – Spyga

+0

@Spyga你的意思是什麼鍵? task_key或? – Wilik