Android Firebaseで1つの子オブジェクトのデータを取得する方法を探していました。
Firebase retrieve child Android のようなものを見つけました。すべてのソリューションは「ChildEventListener」の使用を提案していますが、このデータは移動、削除、更新などではなく、現時点で取得する必要があります。
私のデータは、文字列としてhttps://.firebaseio.com/users//creationに保存されます。ブラウザに正確なURLをコピーすると、「creation: "2015/05/31 21:33:55"」が表示されるため、あまり簡単にアクセスできる簡単な方法があるはずです。 「Firebase Forge Dashboard」にあります。
リスナーなしでこれにアクセスするにはどうすればよいですか?
Firebaseリスナーは、初期データと変更の両方に対して起動します。
コレクション内のデータを同期する場合は、ChildEventListener
を使用します。単一のオブジェクトを同期する場合は、ValueEventListener
を使用します。どちらの場合も、データを「取得」していないことに注意してください。これは同期しています。つまり、コールバックは複数回呼び出される可能性があります。つまり、初期データとデータが更新されるたびです。
これは Android用Firebaseのクイックスタートガイド で説明されています。関連するコードと引用:
FirebaseRef.child("message").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
System.out.println(snapshot.getValue()); //prints "Do you have data? You'll love Firebase."
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
上記の例では、値イベントはデータの初期状態で1回発生し、そのデータの値が変更されるたびに再度発生します。
しばらくしてから、クイックスタートを行ってください。 15分以上かかることはなく、頭を悩ませたり質問をしたりする必要がなくなります。 Firebase Android Guide は、おそらく次の質問に適した次の目的地です。具体的には https://firebase.google.com/docs/database/Android/read -and-write
値を直接読み取ることはありません。 .setValue()
で設定できますが、参照オブジェクトに.getValue()はありません。
リスナーを使用する必要があります。値を1回だけ読みたい場合は、ref.addListenerForSingleValueEvent()
を使用します。
例:
Firebase ref = new Firebase("YOUR-URL-HERE/PATH/TO/YOUR/STUFF");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String value = (String) dataSnapshot.getValue();
// do your stuff here with value
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
ソース: https://www.firebase.com/docs/Android/guide/retrieving-data.html#section-reading-once
特定のノードデータを取得するだけで、その動作は完璧です
mFirebaseInstance.getReference("yourNodeName").getRef().addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
Log.e(TAG, "======="+postSnapshot.child("email").getValue());
Log.e(TAG, "======="+postSnapshot.child("name").getValue());
}
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
Log.e(TAG, "Failed to read app title value.", error.toException());
}
});
この方法でデータを保存します:
accountsTable ->
key1 -> account1
key2 -> account2
オブジェクトデータを取得するには:
accountsDb = mDatabase.child("accountsTable");
accountsDb.child("some key").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
try{
Account account = snapshot.getChildren().iterator().next()
.getValue(Account.class);
} catch (Throwable e) {
MyLogger.error(this, "onCreate eror", e);
}
}
@Override public void onCancelled(DatabaseError error) { }
});