【问题标题】:Can't write to Firebase Database inside of Firebase Storage onSuccess listener无法写入 Firebase 存储 onSuccess 侦听器内的 Firebase 数据库
【发布时间】:2017-09-09 18:43:56
【问题描述】:

我正在尝试存储将文件上传到 Firebase 存储后获得的 Firebase 存储 URL,但由于我无法理解的原因,我无法写入存储 onSuccess 内的 Firebase 数据库上的某个位置听众。任何想法为什么?如果这不是存储上传文件的 URL 位置的正确方法,那是什么?

我似乎找不到这样的例子。这是针对安卓的。 谢谢

【问题讨论】:

  • 你能贴一些代码吗?
  • 我一直将文件的下载 URL(和其他元数据)存储在数据库中。所以它必须是特定于您的使用的东西。没有看到minimal code that reproduces the problem(阅读链接,它非常有用)很难说更多。
  • 感谢您的快速回复。今晚回家后我一定会提供一些代码。

标签: android firebase firebase-realtime-database firebase-storage


【解决方案1】:

你想要完成的事情是完全可行的,这是一个例子

    StorageReference fileRef = ....;
    Uri fileUri = ....;
    UploadTask uploadTask = fileRef.putFile(fileUri);

    uploadTask.addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle unsuccessful uploads
            Log.d("TAG", "onFailure: " + exception);

        }
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
       // This is the URL you are looking for, here you should insert it into your db instance...Something like this
         Uri downloadUrl = taskSnapshot.getDownloadUrl();

         DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference(); 
         dbRef.child("uploadUrls").child("url1").setValue(downloadUrl.toString());
        }
    });

希望对你有帮助

【讨论】:

  • 嗨 Wnieves19,这很有帮助。在看到您的评论和 Frank van Puffelen 确认我尝试做的事情是可能的之后,我做了更多的挖掘并发现了问题(至少我认为我做到了)。我试图将 Uri 存储为 uri 而不是字符串。当我试图将我的对象存储到数据库中时,它会导致堆栈溢出!我尝试将其更改为字符串,它似乎工作正常。
  • 似乎有点令人困惑的是,Firebase 允许存储用户照片 url(我可以使用 user.getPhotoUrl() 检索)并且我可以将它们存储为 Uri,但不是来自 Firebase 存储的 uri。我唯一的猜测是来自 Firebase 存储的 Uri 更长,因此是问题所在。如果你们中的任何人能更深入地了解这个问题,那就太好了,但我非常感谢您的帮助,谢谢!
  • 问题在于 getPhotoUrl() 方法返回一个 Uri。关于实时数据库中可以保存的数据类型请参考读写数据文档:firebase.google.com/docs/database/android/read-and-write希望对您有帮助
  • 哦,我刚刚意识到我之前没有存储任何 uri。感谢您的链接,我从未意识到可以保存的特定数据类型:)
【解决方案2】:
 DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference();

 uploadTask.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                // Handle unsuccessful uploads
                Log.d("TAG", "onFailure: " + exception);

            }
        }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
           // This is the URL you are looking for, here you should insert it into your db instance...Something like this
             Uri downloadUrl = taskSnapshot.getDownloadUrl();

            addData(downloadUrl.toString());

            }
        });


public void addData(String downloadUrl)
{

dbRef.child("uploadUrls").child("url1").setValue(downloadUrl);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    相关资源
    最近更新 更多