2017-02-18 5 views
1
{message:{ 
    "id1":{ 
    "name":"name1" 
}, 
    "id2":{ 
    "name":"name2" 
}, 
    "id3":{ 
    "name":"name3" 
}... and so on 
}} 

私は上記のようなfirebaseデータ構造を持っているとしましょう、今私はchild( "id1")... value()を使って最初のidの値(例えばその名前)を取得しようとしています。私は潜在的に同じレベルの "id2"または他のノードのデータにアクセスしてクエリを実行しますか?子ノードを取得してそのデータにアクセスすると、どのデータもクエリされますか?

"メッセージ"内のノードの数が増え始めると、データベースにデータを格納するコストを除いて、単一のノードを照会するとコストがかかります(すべての内部値を取得します)。あなたは、このようにしなければならない

+0

アプリケーション内でデータ構造を維持し、コンストラクタで一度読み込み、後でいつでもデータを更新することができます。アプリケーションの更新firebaseの終わりに。 このようにして、リアルタイム機能を失う –

答えて

0

あなたは

firebase.child("message").addListenerForSingleValueEvent(new ValueEventListener() { 
@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 
    for (DataSnapshot innerDataSanpShot : dataSnapshot.getChildren()) { 
     //DataSnapshot of inner Childerns mean id1, id2.... so on 
     String name = innerDataSnapShot.child("name").getValue().toString(); 
    } 
} 

@Override 
public void onCancelled(FirebaseError firebaseError) { 

} 
}); 

他の方法は、あなたがメッセージの全体データを取得することができ、その後、あなたがこの

によって、すべての子データを得ることができるということです同じレベルにすべての子値を希望されます
dataSnapshot.child("id1"). getValue(); 
+0

私の場合は「id1」以外のノードに触れないようにしたい。興味のあるのは、どのチャットルームに属していても、すべてのメッセージを格納しているマスターノード「メッセージ」を所有することが適切かどうかです。私がすでに特定のchatroomidを持っていて、それがどのmessageidに属するのかを知っていれば。 –

0

ターゲットプラットフォームが分からない場合、私はそのWebベースのアプリケーションを想定しています。問題のノードでデータのクエリを実行するために、次のような何かを行うことがあります。

var data = snapshot.val(); 
var userMessage = data.id1.message; 

この単純な例では、あなたが "を置き換える必要があります、特定の場所、でメッセージが表示されますid1 'を正しい形式で入力します。 'id1'値を使用してデータを照会するノードを特定するときに、他のレベルのデータを呼び出すことはありません。

2番目の質問では、特定の場所でクエリを実行すると、データベースの拡張に応じて1つのノードにクエリを実行すると、それ以上のコストがかかりません。もちろん、ループを追加すると、データベースのサイズに応じて変更されます。

関連する問題