Android: Sqlite аварийно завершает работу из-за большой капли

Первый пост здесь, так что, пожалуйста, потерпите меня, если я что-то не так.

Я пытаюсь хранить изображения для приложения в базе данных sqlite. Изображения должны храниться в виде больших двоичных объектов (это плохая идея?). Код для этого выглядит следующим образом:

public long createPicture(String title, byte [] thumb, byte [] imageData) {
    ContentValues data = new ContentValues();
    data.put(T_KEY_TITLE, title);            
    data.put(T_KEY_CONTENT, imageData);       // <-- blob in the db 
    data.put(T_KEY_THUMB, thumb);

    // db is an SQLiteDatabase
    return db.insert(TABLE_PICS, null, data); // <-- Crash occurs on this line
}

Этот код по большей части работает отлично, но когда я пытаюсь сохранить большие изображения (5 мегапикселей со встроенной камеры), он вылетает. Он не только дает сбой, но и портит базу данных, так что приложение вылетает всякий раз, когда я пытаюсь запустить его снова.

Итак, мой вопрос: есть ли способ обойти это, или я должен поместить большие изображения в виде файлов и просто сохранить путь? Кроме того, я хотел бы получить некоторые общие рекомендации о том, когда использовать sqlite, а когда просто обращаться к файлам.

Спасибо! :)


person Gordy    schedule 02.08.2011    source источник
comment
Сбой немного расплывчат, вы получили трассировку стека, сообщение об ошибке; если нет, то можете ли вы получить что-то в этом роде и опубликовать его?   -  person    schedule 03.08.2011
comment
Я новичок в разработке для Android, но где я могу получить полезные сообщения об ошибках? Когда он падает, он просто дает мне неожиданно остановиться. Я использую настоящий телефон, можно ли получить с него трассировку стека?   -  person Gordy    schedule 03.08.2011
comment
@Gordy: вы можете подключить свой телефон через USB и использовать что-то вроде DDMS (мое предпочтение) в Android SDK для мониторинга логарифма. В качестве альтернативы, если вы используете Eclipse, у него есть перспектива DDMS, чтобы сделать то же самое.   -  person Squonk    schedule 03.08.2011


Ответы (2)


Для хранения изображений обычной и лучшей практикой является их внешнее хранение (на SD-карте или другом внешнем носителе). getExternalStorageDirectory() предоставит вам местоположение для хранения больших файлов или getExternalFilesDir( ), если у вас API 8 и выше.

Транзакция базы данных может иметь множество проблем (недостаточно места, тайм-аут транзакции и т. д.). Вероятно, лучше всего сохранить URI изображения в БД, а затем поместить фактическое изображение во внешнее место.

person John Leehey    schedule 02.08.2011

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

Итак, чтобы сохранить ваше изображение, это будет:

Uri u;
File fi = new File("/sdcard/tmp");
try {
    u = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(), fi.getAbsolutePath(), null, null));
    imageSaveName1 = u.toString();

}

Вы должны сохранить imageSaveName1 в базе данных, а затем использовать для извлечения:

Bitmap b = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), imageSaveName1);
person Jack    schedule 02.08.2011