首页 > 解决方案 > 保存和多次更新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;
    }

还有其他方法吗?当我使用该应用程序时,数据会被保存,但有时每张照片都会在每个事件中加载,有时会有事件未更新。我为我的英语道歉。

标签: androidfirebasefirebase-realtime-databasefirebase-storage

解决方案


在方法中使用addChildEventListeneronChildChanged可以检查更新的事件


推荐阅读