2016-09-30 18 views
1

firebaseデータベースから特定のデータを読みたい。私が現在していることはここにあります。Firebaseデータベースからデータを読み取る

DatabaseReference database = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference myRef = database.child("profiles/"); 

myRef.child(phoneNo).addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     user = dataSnapshot.getValue(User.class); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 

}); 

enter image description here

DB

public void writeToDBProfiles(Object data,String phoneNo) { 
    DatabaseReference database = FirebaseDatabase.getInstance().getReference(); 
    DatabaseReference myRef = database.child("profiles/" + phoneNo); 
    myRef.setValue(data); 
} 

しかし、その返すnullに書き込むための方法...すべてのヘルプは理解されるであろう。

+0

データの読み取り権限がありますか? http://stackoverflow.com/documentation/firebase/5548/how-do-i-listen-for-errors-when-accessing-the-database/22652/detect-errors-when-reading-data-on-androidを参照してください。 #t = 201609302251033886091 –

+0

@FrankvanPuffelen彼が共有するスナップショットは、トップに**デフォルトのセキュリティルールのバナーを持っています**彼の.writeと.readは両方ともauth!= nullですか?**その中に大文字と小文字を区別することができます。間違っていれば私を修正してください。 –

+0

私はそのバナーを見逃しましたが、確かにそれはすべきです。最も可能性の高い問題は、ユーザーが認証されていないことです。単純な 'throw databaseError.toException()'を 'onCancelled()'に追加し、完了リスナーを 'setValue()'に追加すると、最も簡単に見つけることができます。どちらもリンク先のページに記載されています。 –

答えて

1

わかりました。それを整理しました。問題の上記のコードは完全にうまく動作するはずです。 私は、間違いのために同じ問題が発生するかもしれない後のユーザーのために説明しています。

singleSnapshot.getValue(User.class);結果をユーザークラスにキャストできませんでした。なぜなら、データをアップロードするとき、つまりsetValueで というphotoUrlがnullに等しいため、photoUrlが私の子ノードに存在しないことがわかります。だから、私が信じているのは、私のsingleSnapshot.getValueメソッドが結果をキャストすることができなかったということです。

私はUserクラスからphotoUrlを省略しました。関連するモジュールの作業を開始するときに戻ります。

すべての提案と助けをいただき、ありがとうございます。

public class User { 
String name; 
Uri photoURL; 
String bloodGroup; 
String city; 
String country; 
double latitude; 
double longitude; 
boolean availableToDonate; 

// Get, set and constructors are obvious here I am just saving some space in the post 
} 
0

更新日:

あなたの更新されたコードにエラーがここにあります。

myRef.setValue(data); 

あなたは(データ)myRef.setValueとしてデータを追加しようとしているなら、あなたはあなたが一度すべての子供たちにを更新したい場合は、データやを取得している子正確に指定する必要がありますHashMap()メソッドとupdateChildren()メソッドを使用してAtomicデータ更新を行う必要があります。私は1つは、() HashMapを使用してに行くにすべての子を更新する方法を理解するために、このofficial firebase blogを読むことをお勧めします

myRef.child("name").setValue(data); 

だから、特定の子のための正しい方法を更新はこれです。

何か変更があった場合はお知らせください。

+0

私はDBにどのように書き込んでいるのかという質問を更新しました。実際には、/そのノードはプロファイルノード内にあると伝えます。 –

+0

あなたのデータは?あなたはすべての子供や何かを更新していますか? –

+0

更新部分では、setValueを使って特定の子を更新します。 –

0

データベースの場所を指定している間は、常に逆のカンマでそのフォルダ名を使用する必要があります。 DatabaseReference myRef = database.child( "profiles");

の代わりにDatabaseReference myRef = database.child( "profiles /");

6

あなたは、あなたがこの

DatabaseReference database = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference ref = database.child("profiles"); 

Query phoneQuery = ref.orderByChild(phoneNo).equalTo("+923336091371"); 
phoneQuery.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 
      user = singleSnapshot.getValue(User.class); 
     } 
    } 
    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Log.e(TAG, "onCancelled", databaseError.toException()); 
    } 
}); 

のようなクエリを使用することができ、電話番号を使用して特定のデータを取得したい場合は、私はこれが最善の方法だと思います。

関連する問題