web-dev-qa-db-ja.com

Android Firebase、1つの子オブジェクトのデータを取得するだけです

Android Firebaseで1つの子オブジェクトのデータを取得する方法を探していました。

Firebase retrieve child Android のようなものを見つけました。すべてのソリューションは「ChildEventListener」の使用を提案していますが、このデータは移動、削除、更新などではなく、現時点で取得する必要があります。

私のデータは、文字列としてhttps://.firebaseio.com/users//creationに保存されます。ブラウザに正確なURLをコピーすると、「creation: "2015/05/31 21:33:55"」が表示されるため、あまり簡単にアクセスできる簡単な方法があるはずです。 「Firebase Forge Dashboard」にあります。

リスナーなしでこれにアクセスするにはどうすればよいですか?

48
26hmkk

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

57

値を直接読み取ることはありません。 .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

22
lenooh

特定のノードデータを取得するだけで、その動作は完璧です

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());
    }
});
11
tej shah

この方法でデータを保存します:

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) { }
            });
10
bat-el.g