Проблема с Android sqlite / BLOB

С тех пор как я перевел свои данные из ArrayList в базу данных sqlite на Android, у меня серьезное падение производительности. Никаких курсоров не осталось открытым, что может привести к этому, поэтому я подозреваю, что проблема связана с изображениями, которые я храню в поле BLOB.

Приложение создает Карты , у которых есть поле cardBitmap, которое заполняется растровым изображением при создании.

Может ли кто-нибудь сказать мне по их опыту, какое решение более результативно:

  1. CardBitmap содержит ссылку (путь) к файлу на SD-карте, которая будет нарисована при создании. В базе данных хранится только путь.
  2. CardBitmap содержит объект ( BitmapFactory.decodeStream (imageStream, null, null) ), где imageStream считывается как ByteArrayInputStream из соответствующего поля базы данных.

Любые предложения будут полезны. Благодаря!

Ваше первое решение лучше , используйте файл с SD-карты и сохраните ссылочный путь в базе данных sqlite, что дает вам более высокую производительность, а также ваша база данных остается легкой.

У меня еще нет репутации, чтобы прокомментировать ответ, поэтому я добавлю 2cts вместо ответа, пожалуйста, простите меня.

Я искал ответ на аналогичный вопрос, и я не думаю, что текущий ответ удовлетворительный, потому что если вы спросите SQLite.org, они скажут вам, что это зависит от размера блоба и размера страницы.

Они сделали тест, а не на Android, но это показывает, что сохранение blob в SQLite быстрее для небольших капель (до 20 КБ), чем хранение в отдельных файлах. Тем не менее, для blobs больше 100 КБ, падение производительности велико, и лучше хранить капли в отдельных файлах, как вы (user370605). См. http://www.sqlite.org/intern-v-extern-blob.html.

Я рассмотрю вопрос, который не ответил на Android.

У меня недостаточно репутации, чтобы делать комментарии. Я добавляю этот ответ, чтобы помочь любому, кто все еще ищет какое-то предложение. После нескольких лет улучшения аппаратного обеспечения производительность этих двух решений мало чем отличается. Я несколько раз пробовал в своем Nexus 6p, записывая двоичный файл размером около 2 Мбайт для SQLite, в среднем занимает всего 50 мс. Несмотря на то, что внешнее хранилище будет работать лучше, текущая производительность может соответствовать моим ожиданиям. Запись на SQLite не требует разрешения WRITE_EXTERNAL_STORAGE, которое может быть отменено, если разрешение предоставлено из других приложений. В этом случае SQLite может быть хорошим выбором.

Intereting Posts
Выравнивание текста в соответствии с выбором языка (LEFT -RIGHT) Выполнение не выполнено для задачи ': app: dexDebug' Android Studio Scolling с несколькими RecyclerViews в макете Как проверить значения TextInputLayout (подсказка, ошибка и т. Д.) С помощью Android Espresso? Libgdx бросает исключение на приложение helloworld при запуске в эмуляторе Kotlin, когда с несколькими значениями не работает, когда значение представляет собой вид android Разрешить только уникальную запись данных с Android SQLite? Как загрузить файл изображений и видео с помощью HttpPost в android AttributeError: объект 'module' не имеет атрибута 'SignedJwtAssertionCredentials' Есть ли какой-нибудь эмулятор Android, поддерживающий вход микрофона? Скопировать каталог из активов в папку с данными Тестирование блоков Android для отказа от типа сборки Debug Заставляет Android использовать RTSP / AVP / TCP чередующиеся BaseExpandableListAdapter вызывает getgroupview (), когда я редактирую данные в EditText Как показать combobox в Android?