android - 保存和多次更新firebase
问题描述
我需要在我的应用中修改用户的个人资料。我在 Firebase 存储中保存了 2 个图像,并且我必须在 Firebase 数据库的两个节点中保存用户的新信息。(用户和事件-事件 ID-作者)这是我的 Firebase 控制台:
Firebase-root
|
--- Users
|
--- uid
|
--- name: "name"
|
--- city: "Campobasso"
|
--- url_photo_small: "urlStorage"
|
--- url_photo_large: "urlStorage"
--- Events
|
--- eventsID
|
--- author
|
--- uid
|
--- name: "name"
|
--- city: "Campobasso"
|
--- url_photo_small: "urlStorage"
|
--- url_photo_large: "urlStorage"
--- UsersEvents
|
--- uid
|
--- eventsID:true
这是我要更新的代码
private ArrayList<String> eventi = new ArrayList<>();
..
rootRef = FirebaseDatabase.getInstance().getReference();
//I load in eventi the events that contains the user's data and that I must update.
rootRef.child("UsersEvents").child(uid).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot data: dataSnapshot.getChildren()){
eventi.add(data.getKey());
Log.d(TAG,data.getKey());
updateEventForAuthor(eventi);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
final Map<String,Object> userDataEvents= new HashMap<>();
//I use userDataEvents for update author in events
userDataEvents.put("uid",uid);
userDataEvents.put("name",name.getText().toString());
userDataEvents.put("city",citta.getText().toString());
//firebaseUpdate is the data to save in Users node
firebaseUpdate.put("/Users/"+uid+"/uid",uid);
firebaseUpdate.put("/Users/"+uid+"/name",name.getText().toString());
firebaseUpdate.put("/Users/"+uid+"/city",citta.getText().toString());
StorageReference path = storeRef.child(uid).child("pics").child("profile");
//I save the first image, take its url and I save the data in Events and Users. path.child("small"+uid+".jpg").putFile(uri_image_small).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
if(task.isSuccessful()){
url_image = task.getResult().getDownloadUrl().toString();
userDataEvents.put("url_photo_small",url_image);
firebaseUpdate.put("/Users/"+uid+"/url_photo_small",url_image);
//I save user's data in every events associated to him
if(eventi.size()!= 0){
for(int i=0;i<eventi.size();i++){
firebaseUpdate.put("/Events/"+eventi.get(i)+"/author",userDataEvents);
}
}
//Update user's data
rootRef.updateChildren(firebaseUpdate);
Toast.makeText(getApplicationContext(),"Upload eseguito small..",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getApplicationContext(),"Errore durante Upload Image",Toast.LENGTH_LONG).show();
}
}
});
//I save the second image and update data in Users and in Events
path.child("large"+uid+".jpg").putFile(uri_image_large).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
if(task.isSuccessful()){
url_image = task.getResult().getDownloadUrl().toString();
userDataEvents.put("url_photo_large",url_image);
firebaseUpdate.put("/Users/"+uid+"/url_photo_large",url_image);
if(eventi.size()!= 0){
for(int i=0;i<eventi.size();i++){
firebaseUpdate.put("/Events/"+eventi.get(i)+"/author",userDataEvents);
}
}
//Aggiorna il nodo user
rootRef.updateChildren(firebaseUpdate);
Toast.makeText(getApplicationContext(),"Upload eseguito small..",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getApplicationContext(),"Errore durante Upload Image",Toast.LENGTH_LONG).show();
}
}
});
在哪里
private void updateEventForAuthor(ArrayList<String> eventi) {
this.eventi = eventi;
}
还有其他方法吗?当我使用该应用程序时,数据会被保存,但有时每张照片都会在每个事件中加载,有时会有事件未更新。我为我的英语道歉。
解决方案
在方法中使用addChildEventListeneronChildChanged
可以检查更新的事件
推荐阅读
- format - SpatRaster 的原点、分辨率和坐标在使用某些文件格式(并非全部)写入/读取后(略微)修改
- mysql - Mysql 安装在 EC2 T3.Large 中:错误代码:2013。在查询期间丢失与 MySQL 服务器的连接
- html - 如何将 .ejs 文件连接到 .html 文件?
- cosmos-sdk - 在 cosmos sdk 中支付验证者的 gas 费?
- laravel - 通过 2 个模型建立雄辩的关系
- shell - jq:获取管道输出并插入到 json 文件中
- php - PHP 控制器职责
- r - 有没有办法用 ggplot2 在条形图中用线图绘制每个周期的变化?
- sharepoint - 在 Azure 管道中运行 sharepoint 项目时出错
- sql - 随着时间的推移跟踪活动对象