保存图像从服务器URL SQLite数据库 [英] Save image in SQLite database from server URL
问题描述
喜逢身体我坚持一个问题,即如何将图像保存在我们的SQLite数据库。图片居住在特定的URL EG- http://images.201bestbuy.com/images/small_137385013870957.jpg
Hi every body i am stuck with a problem that how to save images in our SQLite database . Image reside at particular url e.g.- http://images.201bestbuy.com/images/small_137385013870957.jpg
现在我想从这个网址我sqlit数据库来保存图像而无需用户交互。为了解决这个问题,我用
Now i want to save image in my sqlit database from this url without user interaction. To solve this issue i used
public class ImageLoader {
MemoryCache memoryCache = new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews = Collections
.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
public ImageLoader(Context context) {
fileCache = new FileCache(context);
executorService = Executors.newFixedThreadPool(5);
}
final int stub_id = R.drawable.no_image;
public void DisplayImage(String url, ImageView imageView) {
imageViews.put(imageView, url);
Bitmap bitmap = memoryCache.get(url);
if (bitmap != null){
imageView.setImageBitmap(bitmap);
}
else {
queuePhoto(url, imageView);
imageView.setImageResource(stub_id);
}
}
private void queuePhoto(String url, ImageView imageView) {
PhotoToLoad p = new PhotoToLoad(url, imageView);
executorService.submit(new PhotosLoader(p));
}
private Bitmap getBitmap(String url) {
File f = fileCache.getFile(url);
// from SD cache
Bitmap b = decodeFile(f);
if (b != null)
return b;
// from web
try {
Bitmap bitmap = null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) imageUrl
.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is = conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
bitmap = decodeFile(f);
return bitmap;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
// decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f) {
try {
// decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f), null, o);
// Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
} catch (FileNotFoundException e) {
}
return null;
}
// Task for the queue
private class PhotoToLoad {
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i) {
url = u;
imageView = i;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad) {
this.photoToLoad = photoToLoad;
}
@Override
public void run() {
if (imageViewReused(photoToLoad))
return;
Bitmap bmp = getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url, bmp);
if (imageViewReused(photoToLoad))
return;
BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
Activity a = (Activity) photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
boolean imageViewReused(PhotoToLoad photoToLoad) {
String tag = imageViews.get(photoToLoad.imageView);
if (tag == null || !tag.equals(photoToLoad.url))
return true;
return false;
}
// Used to display bitmap in the UI thread
class BitmapDisplayer implements Runnable {
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
bitmap = b;
photoToLoad = p;
}
public void run() {
if (imageViewReused(photoToLoad))
return;
if (bitmap != null){
photoToLoad.imageView.setImageBitmap(bitmap);
}
else
photoToLoad.imageView.setImageResource(stub_id);
}
}
public void clearCache() {
memoryCache.clear();
fileCache.clear();
}
}
现在问题是,当我使用
ContentValues userdetailValues = new ContentValues();
userdetailValues.put("Key_ProductImage",imageView.setImageBitmap(bitmap));
当我使用这些code在SQLite数据库保存图像。它显示了我的错误。 put()方法既需要参数作为字符串,但返回setImageBitmap(位)的类型为void。如果我的做法是完全错误的,那么请建议我来解决这个问题正确的方式。
When i am using these code for saving images in SQLite database. It shows a error for me. Put() method takes both parameter as string but return type of setImageBitmap(bitmap) is void. If my approach is totally wrong then please suggest me right way to resolve this issue.
推荐答案
我觉得这是存储图像,但提供的答案将图像存储到数据库的好方法。
I feel this is a bad way of storing the images but providing the answer to store an image to database.
您可以将图像转换成位图使用低于code字节
You can convert the image bitmap to bytes using below code
public static byte[] getBytes(Bitmap bitmap)
{
ByteArrayOutputStream stream=new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG,0, stream);
return stream.toByteArray();
}
和可以按如下插入到数据库BLOB数据:
and you can insert to database as blob data as follows:
ContentValues cv=new ContentValues();
cv.put(data, image);
return db.insert(TABLE_NAME, null, cv);
下面的图象数据是BLOB类型的同时插入
Here the image data to be of type BLOB while inserting.
这篇关于保存图像从服务器URL SQLite数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!