如果“玛丽”每次在您的应用程序中都使用相同的帐户登录,即使是新手机或重新安装的应用程序,为什么要在数据库中创建一个新的令牌字段?为什么不总是在同一个令牌字段中写入,以便您始终可以访问该字段。这也将仅向您的用户当前实际使用的手机发送通知。因此,每次用户启动应用程序检查令牌时,如果不相等,则将新令牌写入数据库中。并从服务器端获取这些令牌并发送通知。
我错过了什么吗?
为此,我建议您在应用程序的登录和注册过程中使用 FirebaseAuth。然后使用 generateuid
作为实时数据库中用户的字段 ID。你可以uid
用FirebaseAuth.getInstance().getCurrentUser().getUid()
. uid
因此,无论她使用什么手机,您的用户 Mary 将始终拥有相同的手机。始终使用它在数据库中找到用户uid
并覆盖现有的 Firebase 令牌。这也意味着您的“用户”将不是数据库中的单行字段,而是更复杂和更好的用户表示。您可以为此使用模型类,例如:
public class User {
public long id = 0;
public long account_id = 0;
public String account_name = "";
public String first_name = "";
public String last_name = "";
public String email_address = "";
public String password = "";
public User() {
}
}
如何配置它取决于您。但是使用模型也可以帮助您发布和检索数据,如下所示:
创建新用户:
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).setValue(user);
从实时数据库中检索数据:
DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference databaseUsers = database.child("users");
User myUser = null;
Query usersQuery = databaseUsers.orderByChild("username").equalTo(uid); //you can use any value to order as you want, or you don't have to, there is many options for this query
usersQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChanged(@NonNull DataSnapshot snapshot) {
try {
for (DataSnapshot user : snapshot.getChildren()) {
myUser = user.getValue(User.class);
}
} catch (Exception e) {
e.printStackTrace();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});