Каков наилучший способ создания автономного первого приложения с Firebase Storage и Firebase Firestore? #AskFirebase - PullRequest
1 голос
/ 05 января 2020

Прежде всего, я новичок в Firebase:)

Я не смог найти учебник или пример, показывающий, как создать автономное первое мобильное приложение с Firebase Storage и Firebase Firestore. Я использую Firestore, чтобы сохранить данные об элементах: идентификатор, имя, изображение. Я использую Хранение, чтобы сохранить изображения и связать эти изображения с элементами из Firestore. Когда телефон подключен к inte rnet, все отлично, но я не уверен, как лучше всего добавить элемент, когда устройство не подключено.

Единственное хорошее решение, о котором я мог подумать:

  1. Установите для изображения элемента значение локального URL-адреса файла, чтобы изображение могло отображаться в представлении моего переработчика.
  2. Запуск загрузки элемента и изображения одновременно.
  3. Сохранение изображения sessionUri и локальный путь к файлу, чтобы задача могла быть возобновлена ​​позже.
  4. Обнаружение изменения подключения и возобновление задач с изображениями, если они есть.
  5. Когда загрузка изображения завершена, получите 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;
                }
            });
}

1 Ответ

1 голос
/ 05 января 2020

Это на самом деле не «тривиальный случай», который можно решить с помощью одного API.

Здесь вы имеете дело с двумя различными продуктами - Cloud Storage и Firestore. Каждый из них имеет свои собственные, полностью независимые API и методы хранения данных. Они предназначены для использования по отдельности или вместе, по вашему выбору. Поскольку вы решили использовать их вместе (что здорово!), Вам все равно придется писать код, чтобы справляться с ними независимо, а также склеивать их, используя некоторую схему, которую вы придумали. Похоже, вы знаете, что делаете. Это не становится проще.

...