将一个用户的图像上传到 firebase 存储时,图像的 link 会为数据库中的每个用户更新
When uploading a image for one user to firebase storage, the link of the image updates for every user in database
我正在 Android Studio 中使用 Firebase 实时数据库和 Firebase 存储创建此应用。当用户通过我的应用程序注册时,数据将存储在 Firebase 实时数据库中。然后在个人资料页面上,有一个上传图片的地方。当用户上传图片时,它将存储在 firebase 存储中,link 将在数据库中更新相应用户下的新字段。
我上次检查时它工作正常。但是当我添加一个新用户并上传他的个人资料图片时, link 也会更新所有其他用户。但在 Firebase 存储中,没有任何变化。它只发生在 Firebase 实时数据库中。我找不到任何解决方案。
这是我更新个人资料 link 的部分。
private void UploadProfPic(Uri image_uri) {
final StorageReference strRef = storageReference.child("users/"+ email_i +"/profile.jpg");
strRef.putFile(image_uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(getApplicationContext(), "Image has been uploaded", Toast.LENGTH_LONG).show();
strRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Picasso.get().load(uri).fit().into(profPic);
imgRef = uri.toString();
usrRF.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot dss : snapshot.getChildren()){
String key = dss.getKey();
Map<String, Object> updates = new HashMap<String, Object>();
updates.put("profile_url", imgRef);
usrRF.child(key).updateChildren(updates);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show();
}
});
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull /*@org.jetbrains.annotations.NotNull*/ Exception e) {
Toast.makeText(getApplicationContext(), "Failed to update profile picture", Toast.LENGTH_LONG).show();
}
});
}
此处 usrRf = FirebaseDatabase.getInstance().getReference("users");
Here is my database structure
如有任何帮助,我们将不胜感激。谢谢。
根据您最后的评论:
Yes, Firebase email Authentication
那么你应该考虑保存用户数据,在来自身份验证过程的 UID 下,不 在推送的 ID 下,正如我现在在你的 screenshot 中看到的.这意味着您应该使用以下方法将用户对象添加到数据库:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
usersRef.child(uid).setValue(userObj).addOnCompleteListener(/* ... /*);
并且不使用:
usersRef.push().setValue(userObj).addOnCompleteListener(/* ... /*);
上面说了,要更新上传到登录用户节点的图片,请使用以下更新方法:
final StorageReference strRef = storageReference.child("users/"+ email_i +"/profile.jpg");
strRef.putFile(image_uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(getApplicationContext(), "Image has been uploaded", Toast.LENGTH_LONG).show();
strRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Picasso.get().load(uri).fit().into(profPic);
imgRef = uri.toString();
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
Map<String, Object> updates = new HashMap<String, Object>();
updates.put("profile_url", imgRef);
usersRef.child(uid).updateChildren(updates).addOnSuccessListener(/* ... /*);
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull /*@org.jetbrains.annotations.NotNull*/ Exception e) {
Toast.makeText(getApplicationContext(), "Failed to update profile picture", Toast.LENGTH_LONG).show();
}
});
看,没有涉及for循环?这给您带来了麻烦,因为它正在更新“用户”节点下的所有子节点。
我正在 Android Studio 中使用 Firebase 实时数据库和 Firebase 存储创建此应用。当用户通过我的应用程序注册时,数据将存储在 Firebase 实时数据库中。然后在个人资料页面上,有一个上传图片的地方。当用户上传图片时,它将存储在 firebase 存储中,link 将在数据库中更新相应用户下的新字段。
我上次检查时它工作正常。但是当我添加一个新用户并上传他的个人资料图片时, link 也会更新所有其他用户。但在 Firebase 存储中,没有任何变化。它只发生在 Firebase 实时数据库中。我找不到任何解决方案。
这是我更新个人资料 link 的部分。
private void UploadProfPic(Uri image_uri) {
final StorageReference strRef = storageReference.child("users/"+ email_i +"/profile.jpg");
strRef.putFile(image_uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(getApplicationContext(), "Image has been uploaded", Toast.LENGTH_LONG).show();
strRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Picasso.get().load(uri).fit().into(profPic);
imgRef = uri.toString();
usrRF.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot dss : snapshot.getChildren()){
String key = dss.getKey();
Map<String, Object> updates = new HashMap<String, Object>();
updates.put("profile_url", imgRef);
usrRF.child(key).updateChildren(updates);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show();
}
});
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull /*@org.jetbrains.annotations.NotNull*/ Exception e) {
Toast.makeText(getApplicationContext(), "Failed to update profile picture", Toast.LENGTH_LONG).show();
}
});
}
此处 usrRf = FirebaseDatabase.getInstance().getReference("users");
Here is my database structure
如有任何帮助,我们将不胜感激。谢谢。
根据您最后的评论:
Yes, Firebase email Authentication
那么你应该考虑保存用户数据,在来自身份验证过程的 UID 下,不 在推送的 ID 下,正如我现在在你的 screenshot 中看到的.这意味着您应该使用以下方法将用户对象添加到数据库:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
usersRef.child(uid).setValue(userObj).addOnCompleteListener(/* ... /*);
并且不使用:
usersRef.push().setValue(userObj).addOnCompleteListener(/* ... /*);
上面说了,要更新上传到登录用户节点的图片,请使用以下更新方法:
final StorageReference strRef = storageReference.child("users/"+ email_i +"/profile.jpg");
strRef.putFile(image_uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(getApplicationContext(), "Image has been uploaded", Toast.LENGTH_LONG).show();
strRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Picasso.get().load(uri).fit().into(profPic);
imgRef = uri.toString();
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
Map<String, Object> updates = new HashMap<String, Object>();
updates.put("profile_url", imgRef);
usersRef.child(uid).updateChildren(updates).addOnSuccessListener(/* ... /*);
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull /*@org.jetbrains.annotations.NotNull*/ Exception e) {
Toast.makeText(getApplicationContext(), "Failed to update profile picture", Toast.LENGTH_LONG).show();
}
});
看,没有涉及for循环?这给您带来了麻烦,因为它正在更新“用户”节点下的所有子节点。