[转:原文]

最近在处理将图片保存到sqlite数据库中问题,在网上搜了很久,得出图片存数据库中基本以BINARY 或bolb数据类型保存 ,这两种数据类型保存都可以,相对而言blob要合适一些,因为:

BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
 
大型对象
BLOB就是使用二进制保存数据。
如:保存位图。

\SQLite3 支持的数据类型5种:Null,Integer,Real(浮点数),Text,BLOB(二进制对象)

BLOB 是二进制大对象(binary large object)的首字母缩写,是在 SQL Server 中作为一个单一实体存储的二进制数据集合。
BLOB 主要用于保存多媒体对象,比如图像、视频和声音,但是它们还可以存储程序,甚至是代码片断。
虽然 SQL Server 支持 BLOB,但不是所有数据都支持。

Android数据库中存取图片通常使用两种方式,一种是保存图片所在路径,二是将图片以二进制的形式存储(sqlite3支持BLOB数据类型)。对于两种方法的使用,好像第二种方法不如第一种方法更受程序员欢迎,他们认为,在很多数据库语言里,处理大字段都是不容易的,像图片这样的文件放在数据库里会有问题:对数据库的读写速度永远赶不上文件系统的处理速度,使数据库变得巨大;但也有很多人认为像图片这样的数据存放在数据库中也有好处:易于备份,且备份速度绝对比备份文件快,比较容易数据迁移等等。其实这两种方法都有优缺点,具体使用哪种方法要视情况而定。个人倾向于使用数据库存取图片,因为个人认为存到数据库里的数据不会因外部数据的变化而丢失改变,比如你拍照获得一张图片,如果是将路径存到数据库,当这张照片被删除之后,下次读取数据库就得不到想要的结果了。接下来详细介绍数据库存取图片的方法:

1.从资源中获取Bitmap对象

1     Resources res = getResources(); 2     Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon);

2.把图片转换成字节

public byte[] img(int id)
{
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(id)).getBitmap();
     bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
     return baos.toByteArray();
}

3.在数据库中插入图片

//在数据库创建时,图片字段的数据类型存储为 BLOB数据库插入操作
public void onCreate(SQLiteDatabase db)

    String sql = "create table " + TB_NAME + " ( " + ID + " integer primary key , " + IMAGE + " BLOB ) ";
    db.execSQL(sql);
}

//将图片一字节形式存储数据库读取操作
public long insert(byte[] img) 

    SQLiteDatabase db = getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(IMAGE, img);
    long result = db.insert(TB_NAME, null, cv);
    return result;
}

4.获取存入数据库的图片(Bitmap)

public Bitmap getBmp(int position) 
{
    SQLiteDatabase db = getReadableDatabase();
    Cursor cursor = select(TB_NAME);
    cursor.moveToPosition(position);
    byte[] in = cursor.getBlob(cursor.getColumnIndex(IMAGE));
    Bitmap bmpout = BitmapFactory.decodeByteArray(in, 0, in.length);
    return bmpout;
}

//imgView.setImageBitmap(bm);

5.转换获取的图片(Bitmap)为Drawable

public Drawable chage_to_drawable(Bitmap bp)
{
    //因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。
    Bitmap bm=bp; 
    BitmapDrawable bd= new BitmapDrawable(getResource(), bm); 
    return bd;
}

1、bitmap保存到SQLite 中 数据格式:

Java代码  
  1. db.execSQL("Create table express ( _id INTEGER PRIMARY KEY AUTOINCREMENT,express_no varchar(100),express_name TEXT,express_img BLOB );");

2、bitmap 变为 Blob

Java代码  
  1. ContentValues values = new ContentValues();
  2. final ByteArrayOutputStream os = new ByteArrayOutputStream();
  3. bmp.compress(Bitmap.CompressFormat.PNG, 100, os);
  4. values.put("express_img", os.toByteArray());
  5. values.put("express_name","zf");
  6. values.put("express_no","zf");
  7. getContentResolver().insert("express", values);

3、从SQLite中读取Bitmap

Java代码  
  1. byte[] in=cur.getBlob(cur.getColumnIndex("express_img"));
  2. bmpout=BitmapFactory.decodeByteArray(in,0,in.length);

显示在ImageView上

Java代码  
  1. ImageView imageView = (ImageView) view.findViewById(R.id.img);
  2. ByteArrayInputStream stream = new ByteArrayInputStream(cur.getBlob(cur.getColumnIndex("express_img")));
  3. imageView.setImageDrawable(Drawable.createFromStream(stream, "img"));

总结:

inputStream:  作为数据缓存,数据写如何供别的对象读取,其方法为read();

outputStream:作为数据缓存,将来向别的对象写内容!其方法write();

Java代码  
  1. byte[] in=cur.getBlob(cur.getColumnIndex(MyUser.User.BITMAP_VALUES));

//这样也可以对数据进行初始化,byte是基本类型,不需要之前进行长度定义。

一般只保存图片的路径,没有直接把图片保存进去,我以前也有试过想放图片到SQlite数据库,后来图片才放几张就不能放了。 sqlite数据库到达一定大的情况下就不能往里面加数据
比如说你把image.jpg放在sdcard的images目录下,那你就在数据库存/sdcard/images/image.jpg   ( 我是直接存图片名字,然后调用的时候再补上图片的路径!代码如下private String MUSIC_PATH = new String("/sdcard/feiyang/voice/"); 然后根据需要写上所要的图片名称。

使用SQLite数据库中的blob类型来存储,可以参考下面两个网址: 如何使用blob类型存储mp3文件:http://doc.chinaunix.net/android/200903/164048.shtml android操作sqlite3的blob字段:http://marshal.easymorse.com/archives/2342

1、bitmap保存到SQLite 中 数据格式:

db.execSQL("Create table " + TABLE_NAME + "( _id INTEGER PRIMARY KEY AUTOINCREMENT,USER_AGE  INTEGER,USER_NAME TEXT,BITMAP_VALUES BLOB );");

2、bitmap 变为 Blob

ContentValues values = new ContentValues();

final ByteArrayOutputStream os = new ByteArrayOutputStream();

bmp.compress(Bitmap.CompressFormat.PNG, 100, os);

values.put(MyUser.User.BITMAP_VALUES, os.toByteArray());

values.put(MyUser.User.USER_NAME,"icon");

values.put(MyUser.User.USER_AGE,50);

getContentResolver().insert(MyUser.User.CONTENT_URI, values);

3、从SQLite中读取Bitmap

byte[] in=cur.getBlob(cur.getColumnIndex(MyUser.User.BITMAP_VALUES));

bmpout=BitmapFactory.decodeByteArray(in,0,in.length);

总结:

inputStream:  作为数据缓存,数据写如何供别的对象读取,其方法为read();

outputStream:作为数据缓存,将来向别的对象写内容!其方法write();

byte[] in=cur.getBlob(cur.getColumnIndex(MyUser.User.BITMAP_VALUES));//这样也可以对数据进行初始化,byte是基本类型,不需要之前进行长度定义

存储图片:bitmap

Java代码  
  1. private byte[] getIconData(Bitmap bitmap){
  2. int size = bitmap.getWidth()*bitmap.getHeight()*4;
  3. ByteArrayOutputStream out = new ByteArrayOutputStream(size);
  4. try {
  5. bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
  6. out.close();
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. }
  10. return out.toByteArray();
  11. }

获取图片:

Java代码  
  1. Bitmap getIconFromCursor(Cursor c, int iconIndex) {
  2. byte[] data = c.getBlob(iconIndex);
  3. try {
  4. return BitmapFactory.decodeByteArray(data, 0, data.length);
  5. } catch (Exception e) {
  6. return null;
  7. }
  8. }

Android 保存图片到SQLite的更多相关文章

  1. Android 保存图片到SQLite,读出SQLite中的图片

    1.bitmap保存到SQLite 中 数据格式: db.execSQL("Create table express ( _id INTEGER PRIMARY KEY AUTOINCREM ...

  2. 七、Android学习第六天——SQLite与文件下载(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 七.Android学习第六天——SQLite与文件下载 SQLite SQ ...

  3. [Android新手区] SQLite 操作详解--SQL语法

    该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法  :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...

  4. Android版本升级同时Sqlite数据库的升级及之前数据的保留

    http://www.cnblogs.com/wang340/archive/2013/05/06/3063135.html http://www.eoeandroid.com/forum.php?m ...

  5. Android中的SQLite使用学习

    Android中的SQLite使用学习 SQLite是非常流行的嵌入式关系型数据库,轻载, 速度快,而且是开源.在Android中,runtime提供SQLite,所以我们可以使用SQLite,而且是 ...

  6. Android开发之SQLite的使用方法

    前言 SQLite是一种轻量级的小型数据库,虽然比较小,但是功能相对比较完善,一些常见的数据库基本功能也具有,在现在的嵌入式系统中使用该数据库的比较多,因为它占用系统资源很少.Android系统中也不 ...

  7. Android数据库之SQLite数据库

    Android数据库之SQLite数据库 导出查看数据库文件 在android中,为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data ...

  8. Android中使用sqlite笔记

    1.实现SQLiteHelper来在android中使用SQLite.代码如下,来自android官网. public class FeedReaderDbHelper extends SQLiteO ...

  9. Android开发之Sqlite的使用

    在Android中存储数据可以用文件.数据库.网络,其中文件和数据库是最常用的,数据库我们常用的就是Sqlite,它是一种经量级的.嵌入式的关系型数据库:在android中当需要操作SQLite数据库 ...

随机推荐

  1. python logging

    参考: https://docs.python.org/2/howto/logging.html#logging-basic-tutorial https://docs.python.org/2/li ...

  2. [转]关于Android系统的”点九”

    李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/321.html 前几天群成员讨论过关 ...

  3. SVM实现邮件分类

    首先学习一下svm分类的使用. 主要有以下步骤: Loading and Visualizing Dataj Training Linear SVM Implementing Gaussian Ker ...

  4. mysql explain用法

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了,如: explai ...

  5. Designing IP-Based Video Conferencing Systems: Dealing with Lip Synchronization(唇音同步)

    转自:http://www.ciscopress.com/articles/article.asp?p=705533&seqNum=6 Correlating Timebases Using ...

  6. ajax下载文件

    得到所有Post数据: var postData=Request.Form.ToString() 构建JS代码 // Ajax 文件下载jQuery.download = function(url, ...

  7. 关于tarjan算法的理解

    理解要点如下 理解LOW[i]数组的迭代过程.. low[u]=min(dfn[v],dfn[u],low[v]); 理解这个..如果有环..那么后代就可以更新祖先 那么low[v]就有用了.. 那么 ...

  8. 在SQL SERVER中实现RSA加解密函数(第二版)

    /*************************************************** 作者:herowang(让你望见影子的墙) 日期:2010.1.5 注: 转载请保留此信息 更 ...

  9. IOC装配Bean(XML方式)

    Spring框架Bean实例化的方式 提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 无参数构造方法的实例化 <!-- 默认情况下使用的就是 ...

  10. 国内其他的maven库

    转自:http://www.cnblogs.com/woshimrf/p/5860478.html 在oschina关来关去的烦恼下,终于受不了去寻找其他公共库了. 阿里云maven镜像 <mi ...