2017-01-24 13 views
0

多くの関係子リスナーへFirebase多く:今アンドロイド - マイfirebaseデータベースは以下の構造を有する

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

users 
    - user_key_1{ 
     tasks{ 
      task_key_1 : true 
     } 
    } 

は、私が活動中で、ユーザーのタスクの一覧を表示したいと思います。私はこの方法を発見し、それが働いている: mytasksは/ユーザー/ユーザーID /タスク への参照であるとtaskReferenceは/ taskKeyOwnedByUser /タスクです:

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) {} 

    }); 

私の問題は、タスクの変更、つまりユーザーがタイトルを変更してリストUIを更新したときに、どのように変更を検出できますか? OnChildChanged内の "Log.w"は決して呼び出されないようです。

は、タイムスタンプ値にusers/<usersId>/tasks/<taskId>の値の種類を変更する、これは私のアプローチで事前

答えて

0

でいただきありがとうございます。その後、タスクを更新しようとしているときに、onChildChangedがトリガーされるようにタイムスタンプも更新してください。あなたがこのアプローチで

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); 

タスクの名前を更新しようとしているとき

これは、データベースの構造であるが、

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

だろう、これは例の方法で、onChildChangedが発射されます。 これが役に立ちますようお願いいたします。

+0

ありがとう、私はそれを試してみます。私は疑問に思っていました。おそらく、firebaseによって作成された "標準"キーを使用してカスタマイズする方法があります。 – Spyga

+0

@Spygaあなたはどんな鍵を意味していますか? task_keyまたは? – Wilik

関連する問題