因此,我尝试从我的 Firebase 数据库中检索用户个人资料信息,并将其显示在我的 Android 应用程序上,但它似乎根本不起作用!
这是我尝试过的代码,但根本没有运气!
package com.example.ravneet.bloodhub;
import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.TextView;
import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.database.ChildEventListener; 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 java.util.ArrayList;
public class Editprofile extends AppCompatActivity {
TextView chngpsw;
EditText name, state, city, bloodgrp, mobileno, email;
FirebaseUser currentFirebaseUser;
String id;
private static final String TAG = "EditProfile";
ArrayList<String> mylist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_editprofile);
mylist = new ArrayList<String>();
chngpsw = (TextView) findViewById(R.id.chngpsw);
currentFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
id = currentFirebaseUser.getUid();
setTitle("Edit Profile");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
name = (EditText) findViewById(R.id.name);
state = (EditText) findViewById(R.id.state);
city = (EditText) findViewById(R.id.city);
bloodgrp = (EditText) findViewById(R.id.bloodgrp);
mobileno = (EditText) findViewById(R.id.mobileno);
email = (EditText) findViewById(R.id.email);
chngpsw.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(getApplicationContext(), Changepswrd.class);
startActivity(i);
}
});
readData();
if(mylist.size() != 0){
setvalues();
}
//Log.d(TAG, "SIZE IS on Create " + mylist.size());
}
private void readData() {
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Users").child(id);
// Log.d(TAG, "UserID is " + id);
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
fetchdata(dataSnapshot);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
fetchdata(dataSnapshot);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Log.d(TAG, "Bottom Size : " + mylist.size());
}
private void fetchdata(DataSnapshot dataSnapshot){
String value = dataSnapshot.getValue(String.class);
//Log.d(TAG, "Value is " + value);
mylist.add(value);
Log.d(TAG, "Size : " + mylist.size());
}
private void setvalues(){
bloodgrp.setText(mylist.get(0));
city.setText(mylist.get(1));
email.setText(mylist.get(2));
mobileno.setText(mylist.get(3));
name.setText(mylist.get(4));
state.setText(mylist.get(5));
} }
当我尝试在 oncreate 方法中打印 arraylist 的大小时,它显示 0 这是它在 logcat 中显示的内容
> D/EditProfile: UserID is MkfeHsMuJyaNr5Be8R7eRojHngE2 09-24
> D/EditProfile: Bottom Size : 0
> D/EditProfile: Size : 1
> D/EditProfile: Size : 2
> D/EditProfile: Size : 3
> D/EditProfile: Size : 4
> D/EditProfile: Size : 5
> D/EditProfile: Size : 6
这是 Firebase 数据库
最佳答案
您似乎误解了 Firebase 是异步的。
<小时/>您需要移动这些行。
setvalues();
Log.d(TAG, "Bottom Size : " + mylist.size());
在这里。
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
fetchdata(dataSnapshot);
Log.d(TAG, "Bottom Size : " + mylist.size());
setvalues();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
fetchdata(dataSnapshot);
Log.d(TAG, "Bottom Size : " + mylist.size());
setvalues();
}
但是,您的快照中的 fetchdata()
似乎在数据中“太靠下”了。您希望作为一个用户获取整个快照,而不是将每个字符串挑选到列表中。
我建议你使用 POJO 而不是列表来存储 User 类数据
<小时/>例如,如果您想要所有用户,则可以在 Users
键处设置引用,然后 DataSnapshot
是每个 User 值,而不是其中的数据。
final FirebaseDatabase database = FirebaseDatabase.getInstance();
// Here not just getting one ID
DatabaseReference ref = database.getReference().child("Users");
// Attach a listener to read the data at the Users reference
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
// userList.add(user); // for example
}
使用database.getReference().child("Users").child(id);
也可能适用于此模式。
关于java - 从 Firebase 检索值并显示在 EditText 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46384584/