は、どのように私は場所すなわちシンド州とパンジャブ(ない子供たち)の子だけを表示したいだけfirebase
に子キーを取得します。それは可能でしょうか、もしそうなら、どうすればいいのですか?ドキュメント内Best practices for data structureから
は、どのように私は場所すなわちシンド州とパンジャブ(ない子供たち)の子だけを表示したいだけfirebase
に子キーを取得します。それは可能でしょうか、もしそうなら、どうすればいいのですか?ドキュメント内Best practices for data structureから
:
がFirebaseリアルタイムデータベースがネスティングデータを最大32の レベルの深ことができますので、あなたはこれが あるべきだと思うように誘惑されるかもしれない、ネスティングデータに
を避けてくださいデフォルトの構造。ただし、 データベース内の場所にデータをフェッチすると、すべての子ノードも取得されます。さらに、 データベースのノードで誰かに読み取りまたは書き込みアクセス権を与えると、 もそのノードのすべてのデータにアクセスできます。したがって、 の練習では、データ構造を可能な限りフラットに保つことが最善です。
Firebaseが動作する方法です。アイテムを取得すると、その子も取得されます。これを望まない場合は、データベースを再構成する必要があります。
はい、あなたは
ValueEventListener getValueListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Get data from firebase
Log.d("The name of child that you need:", dataSnapshot.getKey());
// ...
}
};
databaseReference.addValueEventListener(getValueListener);
続きを読むことができます:https://firebase.google.com/docs/database/android/read-and-write#listen_for_value_events
ため
punjab sindh
–
ネスティングデータ
を避けFirebaseリアルタイムデータベースは、最大32のレベルの深さネスティングデータを可能にするので、あなたは誘惑されるかもしれませんこれがデフォルトの構造であるべきだと考える。ただし、データベースのある場所でデータをフェッチすると、すべての子ノードも取得されます。さらに、データベースのノードで誰かに読み取りまたは書き込みアクセス権を与えると、そのノードの下にあるすべてのデータへのアクセスも許可されます。したがって、実際には、データ構造を可能な限りフラットに保つことが最善です。
以下は、フラットデータベースの実装方法とロケーションキーの取得方法に関するあなたの構造です。
{
"location": {
"punjab": {
"lahore": true,
"multan": true
},
"sindh": {
"karachi": true
}
},
"place": {
"lahore": {
"location": "punjab",
"details": {
"0": "model",
"1": "steel town"
}
},
"multan": {
"location": "punjab",
"contacts": {
"0": "myarea"
}
},
"karachi": {
"location": "sindh",
"contacts": {
"0": "hadeed",
"1": "Steel town"
}
}
}
}
以下は、ロケーションキーを取得するために使用できるコードです。 Firebaseの詳細については
private DatabaseReference mDatabase;
// ...
mDatabase = FirebaseDatabase.getInstance().getReference();
mLocation = mDatabase.child("location");
mPlace = mDatabase.child("place");
ValueEventListener placeListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Get Post object and use the values to update the UI
Place place = dataSnapshot.getValue(Place.class);
String location = place.location;
System.out.println(location);
}
};
mPlace.addValueEventListener(placeListener);
:
これは、ネスティングデータはで推奨されていないもののuは子供の名前
HashMap<String, Object> allData = (HashMap<String, Object>) dataSnapshot.getValue();
String[] yourChildArray = allData.keySet().toArray(new String[0]);
を得ることができる方法でありますNoSQLデータFirebaseようアーゼは、子供の名前を取得するには、あなたのコードは、あなたが今、あなたがやりたいlocationNamesを使用することができ、この
DatabaseReference mainRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference locationref = mainRef.child("location");
final ArrayList<String> locationNames = new ArrayList<>();
locationref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
locationNames.add(dataSnapshot.getKey());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
のようになりますノード。
Firebaseはレベル32のレベル1のノードをすばやく検索できます。深さは技術レベルの速度に影響する要因ではありませんが、Firebaseの長年の経験では深くネストされたデータが頻繁に手に入るパフォーマンス上の問題が発生します。例として、私は書類を読むことを勧めます、Best practices for data structure in FirebaseとStructuring your Firebase Data correctly for a Complex App。
あなたは、実際のデータベース構造を変更したいとlocation
ノードがあなたのFirebaseルートの直接の子であると仮定していない場合は、下記のコードを参照してください。
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference locationRef = rootRef.child("location");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String key = ds.getKey();
Log.d("TAG", key);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
locationRef.addListenerForSingleValueEvent(eventListener);
あなたの出力は次のようになります。
子供の名前を返しますdataSnapshot.getKey() - 私はこれは何が必要だと思う。そのDatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("location");
final ArrayList<String> statesArrayList= new ArrayList<>();
databaseReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
statesArrayList.add(dataSnapshot.getKey());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
使用クエリがあることに注意してください。 –