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, за да наблюдавате logcat. Като алтернатива, ако използвате Eclipse, той има перспектива DDMS, за да направи същото.   -  person Squonk    schedule 03.08.2011


Отговори (2)


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

Транзакцията на базата данни може да има много неща, които се объркат (недостатъчно място, изчакване на транзакцията и т.н.). Вероятно е най-добре да съхраните URI на изображението в DB, ​​след което да поставите действителното изображение на външно място.

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