如何用android检查firebase中是否存在值?

时间:2018-04-25 04:11:45

标签: android firebase firebase-realtime-database

所以,我最近了解了firebase数据库,现在我能够插入数据了。我有这个脚本,用于将数据存储到我的firebase。

mDatabase = FirebaseDatabase.getInstance().getReference("Biodata");
String userId = mDatabase.push().getKey();
Biodata bio = new Biodata("MyUser", "MyUser@email.com");
mDatabase.child(userId).setValue(bio);

上面的脚本位于oncreate,所以当我一次又一次地运行Activty时,数据会插入两次或更多次

这是我的firebase

Biodata
-LAuyJho4kTnJt5WuCtJ 
    Email:  "MyUser@email.com" 
    Fullname:  "MyUser"

我的bidata课程

@IgnoreExtraProperties
public class Biodata {

    public String Fullname;
    public String Email;

    public Biodata() {
    }

    public Biodata(String Fullname, String Email) {
        this.Fullname = Fullname;
        this.Email = Email;
    }

}

那么,我如何阻止我的应用程序两次插入相同的数据?

3 个答案:

答案 0 :(得分:2)

首先,您不必在onCreate方法上调用它。但这是另一种不创建重复的简单方法。您必须为每个用户创建一个随机密钥。比如说,电子邮件ID对所有用户都是唯一的。所以

mDatabase = FirebaseDatabase.getInstance().getReference("Biodata");
Biodata bio = new Biodata("MyUser", "MyUser@email.com");
mDatabase.child("MyUser@email.com").setValue(bio);

通过这种方式,用户的详细信息位于他们自己的电子邮件ID下。您也可以更轻松地获取详细信息。此外,这不会创建重复项,因为电子邮件ID是唯一的。在firebase中它看起来像这样:

Biodata
 MyUser@email.com
    Email:  "MyUser@email.com" 
    Fullname:  "MyUser"

所以稍后如果你想获得用户名,你只需要

DatabaseReference ref= mDatabase.child("MyUser@email.com");

 ref.addListenerForSingleValueEvent(new ValueEventListener() {
 @Override
 public void onDataChange(DataSnapshot dataSnapshot) {
    Biodata bio = dataSnapshot.getValue(Biodata .class);
    // and bio.getName() for getting the name
 }

 @Override
 public void onCancelled(DatabaseError databaseError) {

 }
 });

答案 1 :(得分:1)

请尝试以下代码可能会帮助您

public void setData(){
        final DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference();
        Query queryToGetData = dbRef.child("Biodata")
                .orderByChild("Email").equalTo("MyUser@email.com");
        queryToGetData.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if(!dataSnapshot.exists()){
                    String userId = dbRef.child("Biodata").push().getKey();
                    Biodata bio = new Biodata("MyUser", "MyUser@email.com");
                    dbRef.child("Biodata").child(userId).setValue(bio);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

答案 2 :(得分:1)

您不应将电子邮件添加为父节点,否则您将收到错误。

首先你要添加两次数据,这是因为你在onCreate()下有这个,它应该在一个按钮或任何可能发生的事件下。

其次,您使用push()生成随机ID,因此每次调用onCreate()时都会添加新数据,因为push()用于分隔记录。

要防止出现此问题,请在按钮下添加用户的创建(例如,在“注册”按钮下)。

如果您想将其保留在onCreate()下,请执行以下操作:

mDatabase = FirebaseDatabase.getInstance().getReference("User");
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
String userId=user.getUid();
Biodata bio = new Biodata("MyUser", "MyUser@email.com");
mDatabase.child(userId).setValue(bio);

如果您使用firebase身份验证以及用户登录后,上述操作将起作用。 getUid()将从firebase身份验证中检索用户ID,该身份对每个用户都是唯一的。然后,您就可以将其添加到数据库中。