【问题标题】:How to check for duplicate data in firebase如何检查firebase中的重复数据
【发布时间】:2017-08-31 05:53:06
【问题描述】:

我正在使用火力基地。我想检查我的应用程序的重复数据。目前我让用户输入姓名和电子邮件。但是,如果用户第二次输入相同的姓名和电子邮件,它也会被添加到数据库中。 如何解决这个问题 这是我的代码:

package com.example.zaid_pc.mpd2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

public class tournament extends AppCompatActivity {

private EditText etTournament;
private EditText emailTournament;
private DatabaseReference mDatabaseRefernce;
Button btnTournament;



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tournament);

etTournament = (EditText)findViewById(R.id.etTournament);
emailTournament = (EditText)findViewById(R.id.emailTournament);
btnTournament = (Button)findViewById(R.id.btnTournament);

mDatabaseRefernce = FirebaseDatabase.getInstance().getReference().child("People Registered");

 btnTournament.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {



  final String name = etTournament.getText().toString().trim();
  final String email = emailTournament.getText().toString().trim();

  //mDatabaseRefernce.child("Name").setValue(name);
  //mDatabaseRefernce.child("Email").setValue(email);



final DatabaseReference peopleRegisered = mDatabaseRefernce.push();
peopleRegisered.child("Name").setValue(name);
peopleRegisered.child("Email").setValue(email);



Toast.makeText(tournament.this, "You will be notified via email", Toast.LENGTH_LONG).show();

finish();




        }
    });


}

}

【问题讨论】:

标签: android firebase firebase-realtime-database


【解决方案1】:

在将数据推送到数据库之前,首先检查数据库是否存在数据

通过以下代码检查用户名是否存在

DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference.child("issue").orderByChild("id").equalTo(0);
query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            // dataSnapshot is the "issue" node with all children with id 0
            for (DataSnapshot issue : dataSnapshot.getChildren()) {
                // do something with the individual "issues"
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

根据您的需要修改此代码

为参考 Firebase querying data

【讨论】:

    【解决方案2】:

    为了解决这个问题,我建议您为每个用户使用一个唯一标识符。此标识符可以是由push() 方法、uidemail address 生成的唯一标识。我建议你最后一个选择。由于 Firebase 不接受密钥中的 . 之类的符号,因此您需要像这样对电子邮件地址进行解析:

    name@email.com -> name@email,com

    要实现这一点,这里有两种方法可以帮助您encodedecode 电子邮件地址。

    private String encodeUserEmail(String userEmail) {
        return userEmail.replace(".", ",");
    }
    
    private String decodeUserEmail(String userEmail) {
        return userEmail.replace(",", ".");
    }
    

    假设你的数据库结构是这样的:

    root
     |
     --- users
            |
            --- name@email,com
                    |
                    --- uid: 4362454274745
                    |
                    --- name: John
    

    您可以使用以下代码验证用户是否存在:

    DatabaseReference userEmailRef = FirebaseDatabase.getInstance().getReference().child("users").child(userEmail);
        ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    Log.d("TAG", "Users exists!");
                } else {
                    //Create user
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {}
        };
        userEmailRef.addListenerForSingleValueEvent(valueEventListener);
    

    其中userEmail是用户的编码邮箱。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      我已经弄清楚了,如下面的代码 您需要在此处添加单值侦听器并检查您要在表中搜索的数据是否存在。

      mFirebaseDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
                  @Override
                  public void onDataChange(final DataSnapshot dataSnapshot) {
                      for (DataSnapshot data : dataSnapshot.getChildren()) {
                       //If email exists then toast shows else store the data on new key
                          if (!data.getValue(User.class).getEmail().equals(email)) {
                              mFirebaseDatabase.child(mFirebaseDatabase.push().getKey()).setValue(new User(name, email));
                          } else {
                              Toast.makeText(ChatListActivity.this, "E-mail already exists.", Toast.LENGTH_SHORT).show();
                          }
                      }
                  }
      
                  @Override
                  public void onCancelled(final DatabaseError databaseError) {
                  }
              });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 2012-12-27
        • 2020-02-25
        • 1970-01-01
        • 2019-10-16
        • 2019-07-15
        相关资源
        最近更新 更多