2017-06-15 2 views

答えて

6

がFirebaseリアルタイムデータベースがネスティングデータを最大32の レベルの深ことができますので、あなたはこれが あるべきだと思うように誘惑されるかもしれない、ネスティングデータに

を避けてくださいデフォルトの構造。ただし、 データベース内の場所にデータをフェッチすると、すべての子ノードも取得されます。さらに、 データベースのノードで誰かに読み取りまたは書き込みアクセス権を与えると、 もそのノードのすべてのデータにアクセスできます。したがって、 の練習では、データ構造を可能な限りフラットに保つことが最善です。

Firebaseが動作する方法です。アイテムを取得すると、その子も取得されます。これを望まない場合は、データベースを再構成する必要があります。

1

はい、あなたは

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

+0

ため

punjab sindh 

6

ネスティングデータ

を避け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); 

-1

これは、ネスティングデータはで推奨されていないもののuは子供の名前

HashMap<String, Object> allData = (HashMap<String, Object>) dataSnapshot.getValue(); 
String[] yourChildArray = allData.keySet().toArray(new String[0]); 
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) { 

    } 
}); 

のようになりますノード。

0

Firebaseはレベル32のレベル1のノードをすばやく検索できます。深さは技術レベルの速度に影響する要因ではありませんが、Firebaseの長年の経験では深くネストされたデータが頻繁に手に入るパフォーマンス上の問題が発生します。例として、私は書類を読むことを勧めます、Best practices for data structure in FirebaseStructuring 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() - 私はこれは何が必要だと思う。その
1
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) { 

    } 
}); 
関連する問題