我可以在 android 上不使用 firebase 中的事件侦听器来获得价值吗?
Can i get value without using event listeners in firebase on android?
我正在使用 Google Firebase 实时数据库的新版本制作一个 Android 应用程序。
当数据 changed/added/deleted/moved 等时,我正在使用 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
不同,这将只获取一次值。
所以你的代码看起来像这样,
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) {
}
});
实际上并非如此,每次您更改数据时它都会更改,并且它可能会调用您的所有活动,这是非常无用的,我什至不知道他们为什么这样做……浪费时间。
@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' 创建一个模型 class,我们称它为 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;
}
}
现在在不同的activity,你要访问的用户名。
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) {
}
});
我正在使用 Google Firebase 实时数据库的新版本制作一个 Android 应用程序。
当数据 changed/added/deleted/moved 等时,我正在使用 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
不同,这将只获取一次值。
所以你的代码看起来像这样,
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) {
}
});
实际上并非如此,每次您更改数据时它都会更改,并且它可能会调用您的所有活动,这是非常无用的,我什至不知道他们为什么这样做……浪费时间。
@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' 创建一个模型 class,我们称它为 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;
}
}
现在在不同的activity,你要访问的用户名。
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) {
}
});