如何防止push()继续创建密钥?

时间:2018-03-22 12:21:26

标签: android firebase firebase-realtime-database

我有一个应用程序,我需要上传几个图像,一切正常,事情就是这样。

  • 如果我重新加载相同的图片,他们会在存储中被替换,只上传那些不存在的图片(这很好,预计会像这样工作)

  • 现在,当照片上传到存储器时,它会为数据库中的每个照片生成一个下载链接,就是当我重新上传更多文件时,它会再次为每个图像创建所有下载链接,我想要的只是继续添加新的,而不是使用不同的键重新上载所有相同的链接

以下是问题的图片:

enter image description here

红色框表示我在每个链接中存储的所有文件,下面的键代表相同文件的不同链接,所以问题是每次不同的键都会推送具有相同文件的链接,我想只保留红色方块的链接,这些链接是上传文件时创建的第一个红色方块。我有这个代码将链接上传到数据库

 File[] filesInFolder = folder.listFiles(); // This returns all the folders and files in your path
        for (File file : filesInFolder) { //For each of the entries do:
            if (!file.isDirectory()) { //check that it's not a dir
                result.add(new String(file.getName())); //push the filename as a string
                Log.e("Files",""+new String(file.getName()));


                    final StorageReference referenciaFotos  = mStorageRef.child("Archivos_Usuarios").child("Fotos").child(new String(file.getName()));

                    referenciaFotos.putFile(Uri.fromFile(file)).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                            String urlFoto = taskSnapshot.getDownloadUrl().toString();
                            Log.e("PhotoUrl",""+urlFoto);

                            String pushKey = mDatabase.push().getKey();

                            Log.e("pushKey",""+pushKey);
                            mDatabase.child("Usuarios").child(uid).child("URL_FotosUsuario").child(pushKey).setValue(urlFoto);

                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {

                            Toast.makeText(GaleriaGrupos2.this, "Can't Upload photos, try again later", Toast.LENGTH_SHORT).show();

                        }
                    });

            }
        }

我正在使用此代码首先列出文件夹中的所有文件,然后上传每个文件并将每个下载链接上传到该文件的数据库,现在当我再次启动该方法时,它将生成新文件每次都有相同链接的随机密钥,但文件不会在存储中被替换。

2 个答案:

答案 0 :(得分:1)

这就是push()方法的作用,它每次调用时都会生成随机密钥,这也是代码中发生的事情。除非您检查数据库中是否已存在这些特定文件,否则它不会停止。为此,我建议您遍历Firebase数据库中的所有子项并查看它是否存在,并且只有在不存在的情况下才使用push()方法。

答案 1 :(得分:1)

每当您发现自己尝试检查某个是否已存在时,请考虑将该值用作。这是因为在Firebase中难以控制唯一的,但根据定义自动唯一。

假设您有以下网址:

https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRiyO2d5CGLgj17OHv?alt=media&token=ec9a3135-5552-44b6-a29d-63e92ecb5c1e
https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRjDAq7Wn-J7UHGqlg?alt=media&token=ab65d303-69ce-4689-b5dc-dcb00fb31ada
https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRj_tlL16qMDQSq3Uo?alt=media&token=e2d88eeb-85cb-4ef9-9e06-ee828eea8d20

如果您像现在一样使用推送ID存储它们,那么您将获得这样的JSON对象:

{
    "-L8A7CfqTeGu5O4ZZG-G": "https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRiyO2d5CGLgj17OHv?alt=media&token=ec9a3135-5552-44b6-a29d-63e92ecb5c1e",
    "-KuOdWgSuZUpvfpj_4hJ": "https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRjDAq7Wn-J7UHGqlg?alt=media&token=ab65d303-69ce-4689-b5dc-dcb00fb31ada",
    "-KkRiogHRn0MeItVNu2J": "https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRj_tlL16qMDQSq3Uo?alt=media&token=e2d88eeb-85cb-4ef9-9e06-ee828eea8d20"
}

但是,让我们看看当我们改为基于URL本身的密钥时会发生什么。如果您只在Cloud Storage for Firebase中存储图像,快速方法是认识到大多数URL都是相同的。因此,让我们只使用每个下载URL的唯一位:

{
    "images%2F-KkRiyO2d5CGLgj17OHv?alt=media&token=ec9a3135-5552-44b6-a29d-63e92ecb5c1e": "https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRiyO2d5CGLgj17OHv?alt=media&token=ec9a3135-5552-44b6-a29d-63e92ecb5c1e",
    "images%2F-KkRjDAq7Wn-J7UHGqlg?alt=media&token=ab65d303-69ce-4689-b5dc-dcb00fb31ada": "https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRjDAq7Wn-J7UHGqlg?alt=media&token=ab65d303-69ce-4689-b5dc-dcb00fb31ada",
    "images%2F-KkRj_tlL16qMDQSq3Uo?alt=media&token=e2d88eeb-85cb-4ef9-9e06-ee828eea8d20": "https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRj_tlL16qMDQSq3Uo?alt=media&token=e2d88eeb-85cb-4ef9-9e06-ee828eea8d20"
}

现在,由于密钥基于URL本身,如果您尝试再次添加相同的URL,则最终会使用相同的密钥。根据定义,您可以保证每个网址只存储一次。