Android SQLite 存储大文件
所谓的大文件,就是动则 100k
以上的,比如图片,音频,视频等。说实话,SQLite
不适合存储大文件,我们一般也很少这么做
但总会有那么几次,很冲动的想把它们放到 SQLite
里,因为好管理啊
接下来我们就来讲讲如何将一张图片保存到 SQLite
里,然后再读出来
Android SQLite 存储大文件
-
创建
SQLite
数据库表的时候,需要创建一个BLOB
字段,用于存储二进制数据这是必须的,也是唯一的选择
db.execSQL("CREATE table img_data (_id INTEGER PRIMARY KEY AUTOINCREMENT,filename VARCHAR(255),data BLOB)")
三个字段,自增
id
,图片文件名,图片数据 -
将图片转换为
BLOB
格式,比如ImageView
中的图片可以用下面的方法// 获取数据库 SQLiteDatabase db = mDBService.getWritableDatabase(); try { ByteArrayOutputStream out = new ByteArrayOutputStream(); 压缩为 PNG 模式,100 表示跟原图大小一样 ((BitmapDrawable) imageview.getDrawable()).getBitmap() .compress(CompressFormat.PNG,100,out); //如果是普通图片,则直接转换为 `Bitmap` 再调用即可 Object[] args = new Object[]{outs.toByteArray()}; db.execSQL("INSERT INTO img_data(filename,data)VALUES(?,?)","img_1.png",args); out.close(); db.close(); } catch (Exception e ){ e.printStackTrace(); }
-
读取
SQLite
中的图片// 获取数据库 SQLiteDatabase db = mDBService.getWritableDatabase(); // 一般情况情况下都是根据 id 来获取 Cursor cursor = db.rawQuery("SELECT filename,data FROM img_data LIMIT 1",null); if ( cursor != null ) { if ( cursor.moveToFirst()) { // 取出图片保存到字节数组中 byte[] img = cursor.getBlob(cursor.getColumnIndex("data")); } cursor.close(); } // 将图片显示到 ImageView 上 if ( img != null ) { ByteArrayInputStream in = new ByteArrayInputStream(img); imageview.setImageDrawable(Drawable.createFromStream(in,"src")); }