Android: Sqlite вылетает из большой капли - PullRequest
2 голосов
/ 03 августа 2011

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

Я пытаюсь сохранить изображения для приложения в базе данных 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, а когда просто переходить на файлы.

Спасибо!:)

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

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

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

2 голосов
/ 03 августа 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);
...