2010-07-02 3 views
6

Sto sviluppando un'applicazione. Ho bisogno di usare almeno 400 file audio che possono essere riprodotti per alcuni testi rispettivi. La mia domanda è qual è il modo migliore e ottimizzato per farlo?Memorizzazione di file audio in un database

Una soluzione consiste nel mettere tutti i file audio nella cartella delle risorse e fare riferimento da lì. Questa non sarà mai una soluzione fattibile in quanto aumenterà la dimensione dell'applicazione. Esiste un modo per convertire il file audio in un formato e scaricarlo nel database SQLite e recuperarlo in modo flessibile? Se sì, quali opzioni ho?

risposta

4

La memorizzazione dei file come BLOB in un db SQLite non consente di risparmiare spazio e di memorizzarli come file. Se questi file non sono destinati ad essere associati a dati dinamici, li inserirò semplicemente nelle cartelle delle risorse, in questo modo verranno compilati nell'APK e potrebbero essere un po 'più veloci da recuperare se fossero in un db.

+0

Ciao Ricardo, grazie per la tua risposta. Se memorizzo i miei file nella cartella degli asset, la mia dimensione dell'applicazione aumenta, è la soluzione fattibile. si prega di commentare questo. o c'è un modo per memorizzare il file audio in un formato a basso consumo? –

+0

Se si archiviano i file nel DB, anche le dimensioni dell'app aumenteranno, non vedo come si possa farla franca includendo più byte senza aumentare le dimensioni ... Si potrebbe provare a zipparli ma non si otterrebbe molto dato che i file musicali sono già molto compressi ... –

+0

@ Vinayak-Bevinakatti, se ti preoccupi delle dimensioni dell'APK, è possibile che tu possa scaricare quei file da un server quando l'app viene eseguita per la prima volta. – Rajeev

0

Qual è la motivazione alla base della memorizzazione dei file in sql lite db? Non vedo molti vantaggi a proposito della memorizzazione del percorso del file nel db e del file effettivo sul file system ...

+0

Ciao Ben, Grazie per la risposta. Se memorizzo i miei file nella cartella delle risorse, la dimensione della mia applicazione aumenta, è la soluzione fattibile. si prega di commentare questo. o c'è un modo per archiviare il file audio in un formato a basso consumo. –

+1

sì ma memorizzarlo nel db non ti farà risparmiare spazio ... – Ben

1

Chiunque mi corregga se ho torto, ma SQLite ha una restrizione della dimensione totale delle righe < 1024KB. Se tutti i file audio sono abbastanza piccoli, è possibile memorizzarli come BLOB.

+0

Non penso che sia vero. https://stackoverflow.com/questions/26968537/maximum-sqlite-size-using-blob – Suragch

4

provare il seguente codice ... è conservato per me .....

@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

La ragione principale per la memorizzazione di file audio su base di dati potrebbe essere l'approccio linea di prodotti. Puoi sviluppare molte molte applicazioni simili semplicemente modificando il tuo database e non toccando il tuo codice.

Non commento le dimensioni dell'applicazione perché ci sono commenti a riguardo e non lo guardo.

Sì. È possibile memorizzare i file audio di piccole dimensioni nel database SQLite come campi BLOB. Funziona bene. Prima memorizza i tuoi dati nel database, quindi recuperali e inseriscili in un file temporaneo. In questo modo è possibile memorizzare i file audio nel database.

Controllare questo:

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();