2010-07-02 175 views
6

我正在开发一个应用程序。我需要使用至少400个可用于某些相应文本的音频文件。我的问题是哪个是最好的和最佳的方式来做到这一点?将音频文件存储在数据库中

一种解决方案是将所有音频文件放在资源文件夹中并从那里引用。随着应用程序大小的增加,这永远不会成为可行的解决方案。有没有办法将音频文件转换为某种格式并转储到SQLite数据库中并灵活地检索它们?如果是这样,我有什么选择?

回答

4

将文件存储为BLOB在SQLite数据库不会节省任何空间vs将它们存储为文件。如果这些文件不是与任何动态数据相关联的,我只会将它们放在资产文件夹中,这样它们就会被编译到APK中,并且如果它们在数据库中可能会更快地检索。

+0

嗨里卡多,谢谢你的回复。如果我将我的文件存储到资产文件夹中,那么我的应用程序大小会增加,这是否可行?请对此评论。或者有什么办法以低消耗的格式存储音频文件? – 2010-07-05 07:20:20

+0

如果你的文件存储在你的数据库中,你的应用程序的大小也会增加,我不明白如何在不增加大小的情况下包含更多的字节。你可以试着压缩它们,但是你不会获得太多因为音乐文件已经被高度压缩了...... – 2010-07-07 14:53:04

+0

@ Vinayak-Bevinakatti,如果您担心APK的大小,可能是您可以在第一次运行应用程序时从服务器上下载这些文件。 – Rajeev 2017-01-27 13:15:36

0

将文件存储在sql lite db中的动机是什么?我没有看到在存储分贝中的文件路径和文件系统上的实际文件有很多好处...

+0

喜奔,感谢您的答复。如果我将文件存储到资产文件夹中,则应用程序大小会增加,这是否是可行的解决方案。请对此评论。或者有什么办法以低消耗的格式存储音频文件。 – 2010-07-05 07:19:09

+1

是的,但将其存储在数据库中不会为您节省任何空间... – Ben 2010-07-05 16:31:53

1

有人纠正我,如果我错了,但SQLite有限制总行大小< 1024KB。如果您的所有音频文件都足够小,则可以将它们存储为BLOB。

+0

我不认为这是真的。 https://stackoverflow.com/questions/26968537/maximum-sqlite-size-using-blob – Suragch 2018-02-27 04:12:24

4

试试下面的代码...它保存为我.....

@Override 
    public void onClick(View arg0) { 

      SQLiteDatabase myDb;  
      String MySQL; 
      byte[] byteImage1 = null; 
      byte[] byteImage2 = null; 
      MySQL="create table emp1(_id INTEGER primary key autoincrement, sample TEXT not null, picture BLOB);"; 
      myDb = openOrCreateDatabase("Blob List", Context.MODE_PRIVATE, null); 
      myDb.execSQL(MySQL); 
      String s=myDb.getPath(); 
      textView.append("\r\n" + s+"\r\n");  
      myDb.execSQL("delete from emp1"); 
      ContentValues newValues = new ContentValues(); 
      newValues.put("sample", "HI Hello"); 


     try 
     { 
     FileInputStream instream = new FileInputStream("/sdcard/AudioRecorder/AudioRecorder.wav"); 
     BufferedInputStream bif = new BufferedInputStream(instream); 
     byteImage1 = new byte[bif.available()]; 
     bif.read(byteImage1); 
     textView.append("\r\n" + byteImage1.length+"\r\n"); 
     newValues.put("picture", byteImage1); 

     long ret = myDb.insert("emp1", null, newValues); 
     if(ret<0) textView.append("\r\n!!! Error add blob filed!!!\r\n"); 
     } catch (IOException e) 
     { 
      textView.append("\r\n!!! Error: " + e+"!!!\r\n"); 
     } 


     Cursor cur = myDb.query("emp1",null, null, null, null, null, null); 
     cur.moveToFirst(); 
     while (cur.isAfterLast() == false) 
     { 
      textView.append("\r\n" + cur.getString(1)+"\r\n"); 
      cur.moveToNext(); 
     } 
    ///////Read data from blob field//////////////////// 
     cur.moveToFirst(); 
     byteImage2=cur.getBlob(cur.getColumnIndex("picture")); 
     bmImage.setImageBitmap(BitmapFactory.decodeByteArray(byteImage2, 0, byteImage2.length)); 
     textView.append("\r\n" + byteImage2.length+"\r\n"); 

     cur.close(); 

     myDb.close(); 


    } 
}); 
1

用于存储数据库的声音文件可能是产品线做的主要原因。您可以通过修改数据库而不是触摸代码来开发许多类似的应用程序。

我不评论应用程序的大小,因为有评论它,我不看它。

是的。您可以将小型声音文件作为blob字段存储在sqlite数据库中。它运作良好。首先将数据存储在数据库中,然后检索并将其放入临时文件中。这样你可以将你的声音文件存储在数据库中。

检查:

soundDataFile = File.createTempFile("sound", "sound"); 
FileOutputStream fos = new FileOutputStream(soundDataFile); 
fos.write(soundData); 
fos.close(); 

mediaPlayer.reset(); 
mediaPlayer.setDataSource(soundDataFile.getAbsolutePath()); 
mediaPlayer.prepare(); 
mediaPlayer.start(); 
相关问题