我正在尝试制作一个用户可以选择更改其姓名,电子邮件等的应用程序。即使我获得了正确的用户ID,每当我尝试更新数据库时,该应用程序都会崩溃
`Attempt to invoke virtual method 'com.google.firebase.database.DatabaseReference com.google.firebase.database.DatabaseReference.child(java.lang.String)' on a null object reference`
这是我的代码
public class EditProfile extends AppCompatActivity {
FirebaseAuth auth;
DatabaseReference databaseReference;
private DatabaseReference mFirebaseDatabase;
private DatabaseReference mFirebaseInstance;
String name2 , email2 ;
EditText name , email , bio;
private SlidrInterface slidr;
ImageView profilePic;
final int PICK_IMAGE_REQUEST = 71;
Uri imageUri;
Button saveButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_profile);
auth = FirebaseAuth.getInstance();
databaseReference = FirebaseDatabase.getInstance().getReference();
final FirebaseUser user = auth.getCurrentUser();
name = (EditText) findViewById(R.id.name);
email = (EditText) findViewById(R.id.email);
bio = (EditText) findViewById(R.id.bio);
profilePic = (ImageView) findViewById(R.id.profilepic);
saveButton = (Button) findViewById(R.id.save);
slidr = Slidr.attach(this);
mFirebaseInstance = FirebaseDatabase.getInstance().getReference();
mFirebaseDatabase = FirebaseDatabase.getInstance().getReference();
final String userID = user.getUid();
Log.d("TAG" , "USERID = "+userID );
databaseReference.child("users").child(user.getUid()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot){
name2 = (String) dataSnapshot.child("name").getValue();
String gender = (String) dataSnapshot.child("gender").getValue();
email2 = (String) dataSnapshot.child("email").getValue();
Log.d("TAG", "Name: " +name2);
Log.d("TAG", "Email: " +email);
Log.d("TAG", "Gender: " +gender);
name.setText(name2);
email.setText(email2);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
profilePic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}
});
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String nameTest = name.getText().toString();
String emailTest = email.getText().toString();
String bioTest = bio.getText().toString();
Log.d("TAG" , "NAMETEST = "+nameTest);
mFirebaseDatabase.child(userID).child("name").setValue(nameTest);
//mFirebaseDatabase.child(user).child("bio").setValue(bioTest);
mFirebaseDatabase.child(userID).child("email").setValue(emailTest);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
&& data != null && data.getData() != null )
{
imageUri = data.getData();
//String test = filepath.toString();
//Log.d("CameraActivity" , " Path is = " +test);
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
//ByteArrayOutputStream stream = new ByteArrayOutputStream();
//bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
//byte[] byteArray = stream.toByteArray();
profilePic.setImageURI(imageUri);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
我无法理解这里的null object refernce
是什么。我已经放入日志语句并检查了各个参数。
D/TAG: USERID = 5tI5e4Y2NeOQ7yq8DwefvmYJk713
D/TAG: Name: Darryl Fernandes
Email: fernsdarryl1@gmail.com
Gender: male
请帮助我解决这个问题。谢谢
编辑
你们可以看到我分离了mFirebaseDatabase
的初始化和声明,但是即使错误消失了,它也不会在firebase上更新
答案 0 :(得分:2)
我可以建议进行一些更改,这将使您的代码更加清晰和易于调试。
首先使用数据库引用的名称来标识数据库中的节点,这样:
FirebaseDatabase db = FirebaseDatabase.getInstance();
DatabaseReference userProfileRef = db.getReference("users").child(userId);
现在使用此引用来添加单值事件而不是值事件,因为您需要读取一次数据以显示配置文件,并且在配置文件更新后,您可以根据需要再次调用单值事件。
userProfileRef.addSingleValueEvent(...)
接下来,除了设置值外,您还可以使用update一次写入所有值。创建一个HashMap<String,Object>
(如果不同字段的数据类型不同,则为对象)。
我们将参考userProfileRef调用更新,因此键将只是配置文件字段名称
map.add("email",email)
map.add("name",name);
userProfileRef.update(map);
此更新调用返回一个Task,您可以在其上添加onCompletionListener并通知用户有关配置文件更新的信息。
答案 1 :(得分:1)
检查您的声明并在其中进行以下更改:
private DatabaseReference mFirebaseDatabase;
并在创建 mFirebaseDatabase
后为其分配值mFirebaseDatabase= FirebaseDatabase.getInstance().getReference();
mFirebaseDatabase.child("/*Pass you're collection name*/").child(userID).child("email").setValue(emailTest);
检查它是否正常工作