android - 如何在使用java编写Android之前从firebase数据库中读取已经存在的数据
问题描述
我正在开发一个安卓应用程序。我将 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。它读取数据库中的所有数据,但只有在保存当前数据后才会这样做。我的意思是仅在执行写入后才完成读取。请让我知道我哪里出错了
解决方案
尝试这个。
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
void onDataChange(DataSnapshot snapshot) {
if (snapshot.hasChild("name")) {
// run some code
}
}
});
.hasChild会告诉你用户是否已经在那里。如果它在那里,您可以继续登录,如果没有,则将用户添加到数据库中。
推荐阅读
- angular - 角材料表粘性标题未按预期工作
- javascript - Load More dispatch a function for render redux fields in component Error fields is undefined
- javascript - 如何将对象列表数组合并为单个数组
- css - 为什么 ::first-letter 中的文本装饰不能级联 ::first-line 中的文本装饰?
- json - Sharepoint在线列表用json指定列宽行高
- swift - 货币格式化程序:尊重区域设置偏好,但始终将货币代码向右移动 - 简化代码
- lotus-domino - Lotus Domino Designer - 对话框列表公式 - 如何按字母顺序显示选项?
- jquery - jquery bootstrapValidator:多个输入值的总和,如果不等于其他输入字段,则禁用提交按钮
- android - 强制应用程序为 64 位设备运行 32 位架构?
- python-3.x - python3中奇怪的多继承