Android 保存图片到SQLite
[转:原文]
最近在处理将图片保存到sqlite数据库中问题,在网上搜了很久,得出图片存数据库中基本以BINARY 或bolb数据类型保存 ,这两种数据类型保存都可以,相对而言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 中 数据格式:
- db.execSQL("Create table express ( _id INTEGER PRIMARY KEY AUTOINCREMENT,express_no varchar(100),express_name TEXT,express_img BLOB );");
2、bitmap 变为 Blob
- ContentValues values = new ContentValues();
- final ByteArrayOutputStream os = new ByteArrayOutputStream();
- bmp.compress(Bitmap.CompressFormat.PNG, 100, os);
- values.put("express_img", os.toByteArray());
- values.put("express_name","zf");
- values.put("express_no","zf");
- getContentResolver().insert("express", values);
3、从SQLite中读取Bitmap
- byte[] in=cur.getBlob(cur.getColumnIndex("express_img"));
- bmpout=BitmapFactory.decodeByteArray(in,0,in.length);
显示在ImageView上
- ImageView imageView = (ImageView) view.findViewById(R.id.img);
- ByteArrayInputStream stream = new ByteArrayInputStream(cur.getBlob(cur.getColumnIndex("express_img")));
- imageView.setImageDrawable(Drawable.createFromStream(stream, "img"));
总结:
inputStream: 作为数据缓存,数据写如何供别的对象读取,其方法为read();
outputStream:作为数据缓存,将来向别的对象写内容!其方法write();
- 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
- private byte[] getIconData(Bitmap bitmap){
- int size = bitmap.getWidth()*bitmap.getHeight()*4;
- ByteArrayOutputStream out = new ByteArrayOutputStream(size);
- try {
- bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
- out.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return out.toByteArray();
- }
获取图片:
- Bitmap getIconFromCursor(Cursor c, int iconIndex) {
- byte[] data = c.getBlob(iconIndex);
- try {
- return BitmapFactory.decodeByteArray(data, 0, data.length);
- } catch (Exception e) {
- return null;
- }
- }
Android 保存图片到SQLite的更多相关文章
- Android 保存图片到SQLite,读出SQLite中的图片
1.bitmap保存到SQLite 中 数据格式: db.execSQL("Create table express ( _id INTEGER PRIMARY KEY AUTOINCREM ...
- 七、Android学习第六天——SQLite与文件下载(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 七.Android学习第六天——SQLite与文件下载 SQLite SQ ...
- [Android新手区] SQLite 操作详解--SQL语法
该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法 :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...
- Android版本升级同时Sqlite数据库的升级及之前数据的保留
http://www.cnblogs.com/wang340/archive/2013/05/06/3063135.html http://www.eoeandroid.com/forum.php?m ...
- Android中的SQLite使用学习
Android中的SQLite使用学习 SQLite是非常流行的嵌入式关系型数据库,轻载, 速度快,而且是开源.在Android中,runtime提供SQLite,所以我们可以使用SQLite,而且是 ...
- Android开发之SQLite的使用方法
前言 SQLite是一种轻量级的小型数据库,虽然比较小,但是功能相对比较完善,一些常见的数据库基本功能也具有,在现在的嵌入式系统中使用该数据库的比较多,因为它占用系统资源很少.Android系统中也不 ...
- Android数据库之SQLite数据库
Android数据库之SQLite数据库 导出查看数据库文件 在android中,为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data ...
- Android中使用sqlite笔记
1.实现SQLiteHelper来在android中使用SQLite.代码如下,来自android官网. public class FeedReaderDbHelper extends SQLiteO ...
- Android开发之Sqlite的使用
在Android中存储数据可以用文件.数据库.网络,其中文件和数据库是最常用的,数据库我们常用的就是Sqlite,它是一种经量级的.嵌入式的关系型数据库:在android中当需要操作SQLite数据库 ...
随机推荐
- K closest points
Find the K closest points to a target point in a 2D plane. class Point { public int x; public int y; ...
- Linux服务器模型及其对应的程序流程
一.TCP循环服务器 TCP循环服务器一次只能处理一个客户端的请求,处理完成后,才能接受下一个客户端的请求,程序流程如下: socket(......);//创建套接字 bind(......);// ...
- OF寄存器的判断
1000 0000 ADD 1100 0000 10 1:符号位是否有进位 有则为1 2:最高有效数值位是否向符号位产生进位 有则为1 1 XOR 0=1所以PF=1
- Android图片上传问题小结
1.图片的显示 出现OOM,原因一般为图片太大, 直接进行尺寸压缩即可. 2.图片的上传(服务器有大小限制) 出现OOM,原因一般为图片太大, 做一次尺寸压缩, 再做一次质量压缩,压缩质量(0-100 ...
- WebConfig配置
安全配置示例 https://msdn.microsoft.com/zh-cn/magazine/gg309184.aspx
- python开发目录合并小工具 PathMerge
前言 这个程序陆陆续续开发了几天,正好我在学Python,就一边做一边学,倒是学到不少东西. 不得不说python是快速开发的好工具. 程序做了一些改进,这两天又忙着毕设,现在才想起来发到博客上.想想 ...
- shell不能执行su 后的脚本
问题:在shell脚本中执行“su – 用户名”后,脚本终止执行,并且切换到su 中指定用户名的交互式界面 现象:我在root中执行一个脚本,但是其中的一些命令或脚本必须用oracle用户来执行., ...
- iTextSharp简单生成pdf和操作pdf添加水印
遇到需要导出页面到pdf,并添加pdf水印的业务.稍微研究了下,借阅网友的前车之鉴,经过使用可行之后的代码贴出来,做个记录,也供需要的网友借阅. public class PDFSetWaterMar ...
- [leetcode] 题型整理之动态规划
动态规划属于技巧性比较强的题目,如果看到过原题的话,对解题很有帮助 55. Jump Game Given an array of non-negative integers, you are ini ...
- RUDP之一 —— UDP VS TCP
原文链接 原文:http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/ 介绍 大家好,我是Glenn Fiedler, ...