新しいバージョンの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..
}
});
出来ますか?リスナーを使用せずに価値を得ることができますか?
私はあなたの助けを待っています。ありがとうございました。
はい、addListenerForSingleValueEvent
を使用してそれを行うことができます。これは、ValueEventListener
やChildEventListener
とは異なり、値を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) {
}
});
実際にはそうではありませんが、データを変更するたびに変更され、おそらくすべてのアクティビティが呼び出されますが、これはかなり役に立たないでしょう。なぜそのようにしたのかさえわかりません。時間の無駄です。
タスク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();
}
もちろん、これを達成する方法はありますが、あなたが望む方法ではないかもしれません。最初に行う必要があるのは、「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) {
}
});