【问题标题】:How to save images into Database如何将图像保存到数据库
【发布时间】:2011-09-22 08:45:19
【问题描述】:

我想知道是否有办法将图像(.gif 类型)保存到 sqllite 数据库。如果是,我的DatabaseAdapter 应该是什么样子。

还有性能问题吗?

【问题讨论】:

    标签: android database sqlite image


    【解决方案1】:

    您应该在数据库中使用BLOB

    检查this tutorial...

    但我认为你应该下载图像并将其存储在 HashMap 中,这样会更简单。

    代码:

    存储

    var imageMap = new HashMap<String, byte[]>();
    
    var imageUrl = "http://i.stack.imgur.com/TLjuP.jpg";
    
    var imagedata = GetImage(imageUrl);      
    
    imageMap.put("img",imagedata);
    


    检索

    var imageData = imageMap.get("img");
    
    var imageStream = new ByteArrayInputStream(imageData);
    
    var image = BitmapFactory.decodeStream(imageStream);
    


    获取图像

    private byte[] GetImage(String url)
    {
        try
        {
            var imageUrl = new URL(url);
            var urlConnection = imageUrl.openConnection();
    
            var inputStream = urlConnection.getInputStream();
            var bufferedInputStream = new BufferedInputStream(inputStream);
    
            var byteArrayBuffer = new ByteArrayBuffer(500);
    
            int current = 0;
            while ((current = bis.read()) != -1)
            {
                byteArrayBuffer.append((byte)current);
            }
    
            return byteArrayBuffer.toByteArray();
        }
        catch (Exception e)
        {
            Log.d("ImageManager", "Error: " + e.toString());
            return null;
        }       
    }
    

    希望对你有帮助。

    【讨论】:

    • 嗯,这是一种数据类型,对数据库没有太大影响。 akadia.com/services/dotnet_load_blob.html
    • 好吧,也许它对数据库没有任何影响,但整体性能如何?我怀疑数据库是否比正常文件加载更快
    • @BojanKogoj 如果要使用一堆图像(数百或数千),DB 会更快 - 在这种情况下,与 FS 相比,DB 更可取
    • 为什么不使用BitmapFactory.decodeByteArray(hh.get("img"), 0, 0) 来解码图像而不是创建一个额外的流?
    【解决方案2】:

    将图像存储到 SQLite 并没有什么特别之处。只需创建具有 BLOB 记录类型的表并执行以下操作:

    protected long saveBitmap(SQLiteDatabase database, Bitmap bmp)
    {
        int size = bmp.getRowBytes() * bmp.getHeight(); 
        ByteBuffer b = ByteBuffer.allocate(size); bmp.copyPixelsToBuffer(b); 
        byte[] bytes = new byte[size];
        b.get(bytes, 0, bytes.length);
        ContentValues cv=new ContentValues();
        cv.put(CHUNK, bytes);
        this.id= database.insert(TABLE, null, cv);
    }
    

    您可能希望逐块保存图像,因为存在限制/推荐的 BLOB 大小(不记得有多少)

    【讨论】:

    • 我可以只插入位图图片还是也可以与gif的png等一起使用?
    • 您要插入哪种格式的图像并不重要。任何图像都可以表示为 Android 位图 - 这实际上不是 Windows BMP(名称令人困惑),而只是 Android 中 PNG/GIF/JPEG 等的内部表示
    【解决方案3】:

    检查这个tutorial,它应该会告诉你你需要什么。
    另一个有用的link

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      相关资源
      最近更新 更多