2010-07-02 67 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(); 
相關問題