web-dev-qa-db-ja.com

AndroidのFirebaseでイベントリスナーを使用せずに価値を得ることができますか?

新しいバージョンのGoogleFirebase RealtimeDatabaseを使用してAndroidアプリケーションを作成しています。

データが変更/追加/削除/移動されたときなどに、ValueEventListenerとChildEventListenerを使用してデータを取得しています。

今、私は問題があります。

私のデータは:

"user 1": {
    "name":"abc"
}

「getName」という名前のボタンがあります。

GetNameボタンをクリックしたときに、ユーザー1のデータの「name」の値を取得したい。

    getName.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            bla bla..
        }
    });

出来ますか?リスナーを使用せずに価値を得ることができますか?

私はあなたの助けを待っています。ありがとうございました。

8
umon

はい、addListenerForSingleValueEventを使用してそれを行うことができます。これは、ValueEventListenerChildEventListenerとは異なり、値を1回だけフェッチします。したがって、コードは次のようになります。

getName.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       ref.addListenerForSingleValueEvent(new ValueEventListener() {
       @Override
       public void onDataChange(DataSnapshot snapshot) {
          // do some stuff once
       }
       @Override
       public void onCancelled(FirebaseError firebaseError) {
       }
});
13
Parag Kadam

実際にはそうではありませんが、データを変更するたびに変更され、おそらくすべてのアクティビティが呼び出されますが、これはかなり役に立たないでしょう。なぜそのようにしたのかさえわかりません。時間の無駄です。

8
Izvorski

タスクAPIフレームワーク を見てください:

@Override
public void onClick(View view) {
    getUser();
}

private Task<User> getUser(String id) {
    final TaskCompletionSource<User> tcs = new TaskCompletionSource();

    ref.child("users")
        .child(id)
        .addListenerForSingleValueEvent(new ValueEventListener() {

            @Override
            public void onCancelled(FirebaseError error) {
                tcs.setException(error.toException());
            }

            @Override
            public void onDataChange(DataSnapshot snapshot) {
                tcs.setResult(snapshot.getValue(User.class));
            }

        });

    return tcs.getTask();
}
1
JP Ventura

もちろん、これを達成する方法はありますが、あなたが望む方法ではないかもしれません。最初に行う必要があるのは、「user」のModelクラスを作成することです。これをUserと呼びましょう。次のようになります。

package Model;

public class User{

private String name; // make sure this matches the one in Firebase


public String getName() {
    return name;
}

public void setName(String name) {
    this.name= name;
}



public User()
{
    //this non-argument constructor is necessary for Firebase to properly map all the variables.
}

public User(String name) {
    this.name= name;

    }
}

ここで、ユーザーの名前にアクセスする別のアクティビティで。

getName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
   databaseRef.child("users").child("user1").addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot snapshot) {
      User user = snapshot.getValue(User.class);
      Log.i("user name", user.getName());




   }
   @Override
   public void onCancelled(FirebaseError firebaseError) {
   }
});

参照が「users」ノードを指していて、特定の名前のユーザーを見つけて他の属性にアクセスしたい場合は、これを行うことができます。

getName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
   databaseRef.child("users").addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot snapshot) {
      User user = snapshot.getValue(User.class);
      if(user.getName().equals("abc"))
      {
          Log.i("other data", user.getOtherData());
       }

   }
   @Override
   public void onCancelled(FirebaseError firebaseError) {
   }
});
0
Danish Ajaib