Android:Sqlite从大blob崩溃

时间:2011-08-02 21:50:22

标签: android sqlite crash large-files

首先发布这里,如果我出错了,请耐心等待。

我正在尝试在sqlite数据库中存储应用程序的图像。图像应该存储为blob(这是一个坏主意吗?)。这样做的代码如下所示:

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 个答案:

答案 0 :(得分:2)

我不建议将整个图像存储在数据库中。相反,为什么不将图像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);

答案 1 :(得分:2)

对于存储图像,通常的最佳做法是将它们存储在外部(存储在SD卡或其他外部存储装置中)。 getExternalStorageDirectory()会为您提供存储大型文件的位置,如果您是API 8及更高版本,则会getExternalFilesDir()

数据库事务可能出现任意数量的问题(空间不足,事务超时等)。最好将图像的URI存储在数据库中,然后将实际图像放入外部位置。