Управление изображениями пользователей в FirebaseStorage - PullRequest
0 голосов
/ 17 октября 2019

Я создаю социальное приложение на Android, используя Firebase. Каждый пользователь может загрузить до трех изображений, которые хранятся с помощью FirebaseStorage.

Активность, когда пользователи добавляют фотографии

Я использую уникальный идентификатор пользователя для именования фотографий. Так, например, будут называться фотографии пользователя: userid_1.jpg, userid_2.jpg, userid_3.jpg

Я использую первое изображение в качестве изображения профиля пользователя. Это все хорошо, но я хочу разрешить пользователю удалять фотографии и добавлять новые.

Так, например, у пользователя есть три фотографии и удаляет первую, поэтому теперь фото2 перемещается на место фото1и фото3 занимает место фото2. Поэтому я могу легко получить этот эффект в упражнении:

photo1ImageView.setImageDrawable(photo2ImageView.getDrawable());
photo2ImageView.setImageDrawable(photo3ImageView.getDrawable());
photo3ImageView.setImageResource(R.drawable.addphotoicon);

Но теперь проблема заключается в том, как справиться с этим в FirebaseStorage. Поэтому, очевидно, я начинаю с удаления картинки.

FirebaseStorage.getInstance().getReference().child("images").child(userID + "_1.jpg").delete();

И тогда я хотел переименовать оставшиеся две картинки.

Так что после удаления photo1, userid_1.jpg исчезает, userid_2.jpg становится userid_1.jpg, userid_3. jpg становится userid_2.jpg

Но переименовать файлы в FirebaseStorage невозможно. Так что теперь, когда это действие загружается в следующий раз, оно поместит photo2 во второй ImageView и photo3 в третий ImageView, оставив первый ImageView пустым. Изображение профиля (userid_1.jpg) также будет потеряно. Это не то поведение, которое мне нужно.

Другой способ, о котором я подумал: при удалении фотографии я удаляю все фотографии пользователя и повторно загружаю оставшиеся с правильными именами, но этоЭто очень неэффективное и ненужное использование в Firebase.

Мне просто интересно, может ли кто-нибудь придумать эффективный способ сделать это.

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Вы можете применить небольшой трюк здесь.
Сохраните вашу ссылку на фотографию пользователя в вашей базе данных как массив объектов. Создайте класс модели для вашей фотографии. который может выглядеть следующим образом:

class UserPhoto {
    var photoRef: String? = null //Reference of your photo in Cloud Storage
    var downloadUrl: String? = null //This is optional, but very handy.
    var timestamp: Long? = null // In milseconds
    var order: Int = -1
}

Здесь вы можете увидеть «отметку времени», а «порядок» - это ключ, чтобы найти, является ли фотография последней или нет. Просто сохраните эти данные в виде массива в пользовательском документе. Каждая фотография будет иметь эти данные. Затем вы можете поместить свою логику в свое приложение / сервер в соответствии с этой моделью данных для каждой пользовательской фотографии.

0 голосов
/ 17 октября 2019

Облачное хранилище не очень хорошо поддерживает последовательность загруженных в него объектов. Даже самые нормальные компьютерные файловые системы не подходят для этого.

Я предлагаю отказаться от идеи, что Storage будет поддерживать любой порядок или последовательность, и полностью перенести эту логику в базу данных или другое хранилище данных, которое дает вамВозможность легко заказать предметы в нем. Имена файлов, загружаемых в хранилище, могут быть случайными - они не нуждаются в значении. Вам просто нужно сохранить их пути в связанных записях в базе данных и синхронизировать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...