2016-10-10 5 views
7

私はOrderノードとその下にStatusというキーを持っています。私はStatusの値の変更を探しています。変更が検出された場合は、readの親にOrderノードが必要です。サブノード値の変化を検出したときに親オブジェクトにアクセスする

重要な点は、Orderノードの変更を聞きたくありません。しかし、Orderノードの下のStatusだけです。これを行う最も最適な方法は何ですか?他のリスナーの内部にリスナーを置くとよいですか?ここに私のコードは次のとおりです。

final Query qRef = FirebaseDatabase.getInstance().getReference().child("orders").orderByChild("customerId").equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid()) 
      .limitToFirst(1); 
    qRef.keepSynced(true); 

    final DatabaseReference reference = qRef.getRef().child("status"); 


    reference.addValueEventListener(new ValueEventListener() { 

     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 


      DatabaseReference inner = reference.getParent(); 

      inner.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot parent) { 
        if (parent != null) { 
         Order newOrder = parent.getValue(Order.class); 
         if (newOrder != null) { 
          if (newOrder.getStatus() != null && !newOrder.getStatus().equals("FX_OVER")) 
           processOrder(newOrder); 
         } 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 

    }); 

とJSON:

{ "20161010210955" : { 
    "createdAt" : { 
     "date" : 10, 
     "day" : 1, 
     "hours" : 21, 
     "minutes" : 9, 
     "month" : 9, 
     "seconds" : 55, 
     "time" : 1476113995244, 
     "timezoneOffset" : -330, 
     "year" : 116 
    }, 
    "customerId" : "npsd3Ldfsdf1x0hsdfsdf2mj14VUA876f2", 
    "id" : "20161010210955", 
    "status" : "FX_FULL" 

    } } 
+0

コードを正常に動作させるには、[問題を再現する最小コード](http://stackoverflow.com/help/mcve)を表示してください。この場合、JSONの小さなスニペット(テキストとして、スクリーンショットなし)も役立ちます。 –

+0

ありがとうございます。質問に自分のコードを追加しました。 @FrankvanPuffelen – Vinod

答えて

2

は、なぜあなたは最初の状態をチェックしませんか?あなたは最初の状態の価値を知っています。私はこの解決策が最適な方法でなければならないと思います。

reference.addValueEventListener(new ValueEventListener() { 

    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 

     if("FX_OVER".equals(dataSnapshot.getValue(String.class)) { 

      reference.getParent().addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot parent) { 
        // This is a defensive check. I dont know this is necessary. 
        // If status exist, parent must be exist. 
        if (parent.exists()) { 
         Order newOrder = parent.getValue(Order.class); 
         if (newOrder != null) { 
          processOrder(newOrder); 
         } 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) {} 
      }); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}); 
+0

私は質問を投稿した後、私はあなたの答えに似た解決策を使ってしまった。ありがとう! – Vinod

関連する問題