首先发布这里,如果我出错了,请耐心等待。
我正在尝试在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以及何时去寻找文件的一般指导原则。
谢谢! :)
答案 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存储在数据库中,然后将实际图像放入外部位置。