文档章节

关于数据库BLOB类型的存储和读取

 仇客
发布于 2017/01/06 17:29
字数 582
阅读 213
收藏 0

现在项目的需求是,在客户端录入一段音频,然后存储到sqlite数据库中,当有需求的时候就从数据库中读取出来播放。现在本人用的是xutils插件,在创建sqlite数据库的时候,关于文件类的保存只能装换成byte数组,所以,本人的思路就是:

1,先通过MediaRecorder类得到一个音频文件

2,将得到的音频文件转换成byte数据,存到sqlite数据库中

3,从数据库中读取byte数据,把byte数组转换成文件

4,用MediaPlayer读取文件,并播放

下面贴出每一步的代码:

1,录音代码:

             private MediaRecorder mRecorder = null;

             private FileName = Environment.getExternalStorageDirectory().getAbsolutePath();  
             FileName += "/audiorecordtest.3gp"; //文件存储的路径,自己设置

             mRecorder = new MediaRecorder();  
             mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);  
             mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  
             mRecorder.setOutputFile(FileName);  
             mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
             try {  
                 mRecorder.prepare();  
             } catch (IOException e) {  
                 Log.e(LOG_TAG, "prepare() failed" + e.toString());  
             }  
             mRecorder.start();

2,将得到的音频文件转换成byte数据,并存入数据库中

            try {
                byte soundbyte[] = null;
                File file = new File(FileName);
                FileInputStream fileinput = new FileInputStream(file);
                ByteArrayOutputStream byteout = new ByteArrayOutputStream();
                byte b[] = new byte[1024];
                int n ;
                while((n = fileinput.read(b)) != -1){
                    byteout.write(b, 0, n);
                }
                fileinput.close();
                byteout.flush();
                byteout.close();
                soundbyte = byteout.toByteArray();
                

                //将得到的byte数据存储到数据库中
                SoundMessage sou = new SoundMessage();
                sou.setSound(sound);
                db.save(sou);
                
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                Log.e("file", e.toString());
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                Log.e("io", e.toString());
                e.printStackTrace();
            } catch (DbException e) {
                // TODO Auto-generated catch block
                Log.e("db", e.toString());
                e.printStackTrace();
            }

   3,需要播放的时候从数据库中读取byte数据并转换成本地文件

    String path = Environment.getExternalStorageDirectory().getAbsolutePath()+                     File.separator + "a.3gp"; //本地存储的路径,自己设置

            try {
                    FileOutputStream fs = new  FileOutputStream(path);
                    SoundMessage soud = db.findFirst(SoundMessage.class); //从数据库中读取byte数据
                    fs.write(soud.getSound());
                    fs.close();
                } catch (FileNotFoundException e1) {
                    // TODO Auto-generated catch block
                    Log.e("file", e1.toString());
                    e1.printStackTrace();
                } catch (DbException e) {
                    // TODO Auto-generated catch block
                    Log.e("db", e.toString());
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    Log.e("IO", e.toString());
                    e.printStackTrace();
                }   

     4,用MediaPlayer读取文件,并播放

                MediaPlayer mPlayer = new MediaPlayer();  
                try{  
                    mPlayer.setDataSource(path);
                    mPlayer.prepare();  
                    mPlayer.start();  
                    timetext.setText(mPlayer.getDuration()+""); //显示音频的时间,(毫秒)
                }catch(IOException e){  
                    Log.e(LOG_TAG,"播放失败"+e.toString()); 
                }
                //播放完之后删除本地文件(本人测试,要是不删除会报错:Unable to create media player)
                File file = new File(path);
                file.delete();

最近开发的项目对数据库的操作比较多,所以一边开发项目一边学习,对数据库的了解也多了一些,本人发现,掌握数据库的技术还有很有用的                        

© 著作权归作者所有

粉丝 1
博文 5
码字总数 3077
作品 0
成都
私信 提问
Oracle中Blob和Clob的作用

  Blob是指二进制大对象也就是英文Binary Large Object的所写,而Clob是指大字符对象也就是英文Character Large Object的所写。由此可见这辆个类型都是用来存储大量数据而设计的,其中BLO...

underA
2013/03/15
69
0
Blob,Text 大文件存入数据库

将图片存储到数据库中(Blob) public void BlogIn(){Connection con=getConnection();System.out.println(con);//插入数据库的语句String sql="insert into user(name,message) values(?,?......

进击的_渣渣
2014/07/13
366
0
Mysql 中的blob相关问题

一、MySQL BLOB 类型介绍 MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。BLOB类型实际是个类型系列(TinyBlob、Blob、MediumBlob、LongBlob)...

文文1
2015/09/08
43
0
JDBC--BLOB

一、BLOB(二进制数据) 1. MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。 2.BLOB字段适用于存储大量的二进制数据,如图像、视频、音频,文件...

大道无名
2016/07/02
53
0
Android sqlite 存取图片

数据库中存取图片通常使用两种方式,一种是保存图片所在路径,二是将图片以二进制的形式存储(sqlite3支持BLOB数据类型)。对于两种方法的使用,好像第二种方法不如第一种方法更受程序员欢迎...

zjbpku
2013/05/04
3.8K
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 人生,还真是到处是意外

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享lil peep的单曲《High School》 《High School》- lil peep 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
55分钟前
24
2
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
9
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
10
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部