当前位置: 首页 > 知识库问答 >
问题:

用Firebase Storage和Firebase FireStore创建离线第一个应用程序的最佳方式是什么?#AskFirebase

郎雅昶
2023-03-14

首先,我对Firebase是新手:)

    null

MCVE:

public void addImageOnClick(final View view) {
    final Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(intent, 123);
}

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    if (requestCode == 123) {
        save("id1", "name1", intent.getData());
    }
}

private void save(final String id, final String name, final Uri imageUri) {
    final Map<String, Object> item = new HashMap<>();
    item.put("id", id);
    item.put("name", name);
    FirebaseStorage.getInstance()
            .getReference("items")
            .child(id)
            .putFile(imageUri)
            .continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                @Override
                public Task<Uri> then(final Task<UploadTask.TaskSnapshot> task) throws Exception {
                    return task.getResult()
                            .getMetadata()
                            .getReference()
                            .getDownloadUrl();
                }
            })
            .continueWith(new Continuation<Uri, Void>() {
                @Override
                public Void then(final Task<Uri> task) throws Exception {
                    item.put("image", task.getResult().toString());
                    FirebaseFirestore.getInstance()
                            .collection("items")
                            .document(id)
                            .set(item);
                    return null;
                }
            })
            .continueWith(new Continuation<Void, Void>() {
                @Override
                public Void then(final Task<Void> task) throws Exception {
                    Toast.makeText(MainActivity.this, String.valueOf(task.isSuccessful()), Toast.LENGTH_LONG).show();
                    return null;
                }
            });
}

共有1个答案

安承教
2023-03-14

这实际上并不是一个可以用单个API解决的“琐碎的情况”。

您在这里处理的是两种不同的产品--云存储和FireStore。它们都有自己的、完全独立的API和存储数据的方法。如果您选择的话,这些区域可以单独使用,也可以一起使用。既然您已经选择将它们一起使用(这很棒!),那么您仍然必须编写代码来独立处理它们,同时还要使用您想出的一些方案将它们粘合在一起。看起来你知道自己在做什么。不会变得更简单的。

 类似资料:
  • 问题内容: Java是我选择的编程语言之一。尽管将应用程序分发给最终用户,但我总是遇到问题。 为用户提供JAR并不总是像我想要的那样友好,并且使用Java WebStart要求我维护Web服务器。 分发Java应用程序的最佳方法是什么?如果Java应用程序需要在用户计算机上安装工件,该怎么办?有没有好的Java安装/打包系统? 问题答案: 有多种解决方案,取决于你的发行要求。 只是用一个jar。这

  • 这并不困难,但它让我质疑spring auth服务器是最好的选择,还是我应该使用Keycloak?

  • 我试图在我的create-react-app项目中包含一些CSS。CSS来自第三方NPM包,因此位于node_modules目录中。 我试过:

  • 我有一个可以很好地并行化的任务,所以我想使用多个线程来加速我的程序。但是,这并不像创建线程并让它们运行那么简单。线程必须重复执行某个任务,中间有中断,即伪代码如下所示: 这种情况非常频繁,准确地说是每秒60次。这就是为什么每次创建新线程都太慢了。我尝试用每个线程的状态变量(运行、暂停、停止)以及带有条件变量的类似事件的构造或轮询机制来解决这个问题。 这两个都只给了我大约两倍的速度,这并不像我想象的

  • 为了让这个布局正常工作,我已经挣扎了好几个小时。 这是我的代码: 每个片段都是一个简单的RelativeLayout(都有相同的视图): 现在我想让它像这样工作: > 1) 无嵌套layout_weight 2)完全没有嵌套(例如嵌套2个第一个片段等) 3)在视图呈现后,不使用代码以编程方式完成。 在我看来,最简洁、可读性最强的方法是将片段1和片段2的方向设置为水平,将片段3设置为垂直,但它不起作

  • 我有一个Wildfly 10 ear应用程序(在服务器容器中运行),它需要能够发布到另一个Wildfly服务器上托管的远程队列。为此,我将这个jar从wildfly\bin\client文件夹复制到ear的lib文件夹中。效果很好。 但是现在,在正式打包之后,当我启动Wildfly和应用程序时,我收到一条错误消息。。。关于这个jar的清单文件。 设置应用程序以使各种类装入器都能找到这个jar的最佳