我正在使用新版Google Firebase实时数据库制作Android应用程序。
当数据更改/添加/删除/移动等时,我将使用ValueEventListener和ChildEventListener获取数据。
现在,我有一个问题。
我的数据是:
"user 1": {
"name":"abc"
}
我有一个名为“getName”的按钮。
当我点击getName按钮时,我希望在用户1数据中获得“name”的值。
getName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bla bla..
}
});
有可能吗? 我可以在不使用听众的情况下获得价值吗?
我在等你的帮助。 谢谢。答案 0 :(得分:12)
是的,你可以使用addListenerForSingleValueEvent
来做到这一点。与ValueEventListener
和ChildEventListener
不同,这只会获取一次该值。
所以你的代码看起来像这样,
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) {
}
});
答案 1 :(得分:8)
实际上并非如此,它会在每次更改数据时发生变化,它可能会调用所有非常无用的活动,我甚至不知道为什么他们这样做了......等待时间。
答案 2 :(得分:1)
@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();
}
答案 3 :(得分:0)
当然,有一种方法可以实现这一点,也许不是你想要的方式。你要做的第一件事是为'用户'创建一个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) {
}
});
如果您的引用指向“用户”节点,并且您希望找到具有特定名称的用户并访问其他属性,则可以执行此操作。
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) {
}
});