用Firebase Storage和Firebase Firestore创建脱机优先应用程序的最佳方法是什么? #AskFirebase

问题描述 投票:1回答:1

首先,我是Firebase的新手:)

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

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

  1. 将商品的图片属性设置为本地文件url,以便可以在我的回收者视图中显示图片。
  2. 同时开始上传项目和图像。
  3. 持久图像sessionUri和本地文件路径,以便以后可以恢复任务。
  4. 检测连通性更改并继续执行图像任务。
  5. 图像上传完成后,在Firestore中获取下载URL和更新项目。然后清除持久图像任务。

我真的希望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;
                }
            });
}
android firebase google-cloud-firestore firebase-storage
1个回答
1
投票

这实际上不是一个可以用一个API来解决的“小问题”。

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

© www.soinside.com 2019 - 2024. All rights reserved.