gpt4 book ai didi

android - 使用 Firebase Storage 和 Firebase Firestore 创建离线第一个应用程序的最佳方法是什么? #AskFirebase

转载 作者:行者123 更新时间:2023-12-04 13:57:22 25 4
gpt4 key购买 nike

首先,我是 Firebase 的新手 :)

我找不到说明如何使用 Firebase Storage 和 Firebase Firestore 创建离线优先移动应用的教程或示例。
我使用 Firestore 来保存有关项目的数据:id、name、image。
我使用存储来保存图像并将这些图像与 Firestore 中的项目链接。
当手机连接到互联网时,一切都很好,但我不确定在设备离线时处理添加项目的最佳方法是什么。

我能想到的唯一好的解决方案:

  • 将项目的图像 Prop 设置为本地文件 url,以便图像可以显示在我的回收站 View 中。
  • 同时开始上传项目和图像。
  • 坚持图片sessionUri和本地文件路径,以便稍后可以恢复任务。
  • 检测连接变化并恢复图像任务(如果有的话)。
  • 图像上传完成后,获取下载 url 并在 firestore 中更新项目。然后清除持久化的图像任务。

  • 我真的很期待 Firebase 客户端库能够开箱即用地处理这样一个微不足道的用例。

    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;
    }
    });
    }

    最佳答案

    这实际上并不是一个可以通过单个 API 解决的“小问题”。

    您在这里处理两种不同的产品 - Cloud Storage 和 Firestore。每个都有自己的、完全独立的 API 和存储数据的方法。如果您愿意,它们可以单独使用或一起使用。由于您选择将它们一起使用(这很棒!),您仍然必须编写代码来独立处理它们,同时还要使用您想出的某种方案将它们粘合在一起。看起来你知道你在做什么。它并没有变得更简单。

    关于android - 使用 Firebase Storage 和 Firebase Firestore 创建离线第一个应用程序的最佳方法是什么? #AskFirebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59600447/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com