我正在开发一个android应用。我正在将Firebase用于后端服务。我想根据他们的电话号码对他们进行身份验证。一个电话号码不能使用多个用户帐户。
数据库结构如下所示。
如果另一个用户输入相同的电话号码,我们将不允许登录。所以我写了下面的代码
单击按钮后,我尝试读取所有用户信息并将其保存在列表中,然后使用当前电话号码检查数据库中的现有电话号码。如果数据已经存在,则不会存储数据。其他数据将被存储
public class ProfileActivity extends AppCompatActivity {
EditText E1, E2, E3;
Button B1,B2;
String phone;
String exist="not_exist";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
Intent intent = getIntent();
phone = intent.getStringExtra("mobile");
onclick();
}
void onclick() {
E1 = (EditText) findViewById(R.id.L_Name);
E2 = (EditText) findViewById(R.id.L_Password);
E3 = (EditText) findViewById(R.id.L_Confirm_Password);
B1 = (Button) findViewById(R.id.login);
B1.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View V) {
DatabaseReference mreadDatabase;
mreadDatabase = FirebaseDatabase.getInstance().getReference().child("users");
mreadDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<User> list = new ArrayList<>();
List<String> username = new ArrayList<>();
List<String> phonearray = new ArrayList<>();
List<String> pswr = new ArrayList<>();
for (DataSnapshot ds : dataSnapshot.getChildren()) {
User user = ds.getValue(User.class);
list.add(user);
}
for (int i = 0; i < list.size(); i++) {
username.add(i,list.get(i).getname());
phonearray.add(i,list.get(i).getphone());
pswr.add(i,list.get(i).getpswr());
Log.e("in copy section","in copy section");
Log.e("username.get(i)", username.get(i));
Log.e("phonearray.get(i)", phonearray.get(i));
Log.e("pswr.get(i)", pswr.get(i));
}
for (int i = 0; i < list.size(); i++) {
Log.e("in check section","in check section");
Log.e("phone",phone);
Log.e("username.get(i)", username.get(i));
if (phone == phonearray.get(i)) {
exist = "exist";
Log.e("exist", exist);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
if (E2.getText().toString().equals(E3.getText().toString()) ) {
Log.e("in store section","in store section");
Log.e("exist",exist);
if (exist == "not_exist") {
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("users");
String userId = mDatabase.push().getKey();
User user = new User(E1.getText().toString(), phone, E2.getText().toString());
mDatabase.child(userId).setValue(user);
Toast.makeText(ProfileActivity.this, "Login Created", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(ProfileActivity.this, MainActivity.class);
Log.e("write", "write");
startActivity(intent);
} else {
Toast.makeText(ProfileActivity.this, "Phone number already registered.Check", Toast.LENGTH_SHORT).show();
}
}
else {
Toast.makeText(ProfileActivity.this, "Password Mismatch.Please check"+E2.getText().toString()+E2.getText().toString(), Toast.LENGTH_SHORT).show();
}
}
}
);
}
}
我尝试使用addListenerForSingleValueEvent和addValueEventListener,它读取数据库中的所有数据,但仅在保存当前数据后才执行。我的意思是只有在执行写操作之后才进行读操作。请让我知道我要去哪里了
答案 0 :(得分:0)
尝试一下。
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
void onDataChange(DataSnapshot snapshot) {
if (snapshot.hasChild("name")) {
// run some code
}
}
});
.hasChild 会告诉您该用户是否已经存在。如果存在,则可以继续登录,如果没有,则将用户添加到数据库中。