2010-07-02 14 views
6

Estoy desarrollando una aplicación. Necesito usar al menos 400 archivos de audio que se pueden reproducir para algunos textos respectivos. Mi pregunta es ¿cuál es la mejor y más optimizada manera de hacer esto?Almacenamiento de archivos de audio en una base de datos

Una solución es poner todos los archivos de audio en la carpeta de recursos y hacer referencia desde allí. Esto nunca será una solución viable ya que aumentará el tamaño de la aplicación. ¿Hay alguna manera de convertir el archivo de audio en algún formato y volcarlo en la base de datos SQLite y recuperarlos de manera flexible? Si es así, ¿qué opciones tengo?

Respuesta

4

Almacenar los archivos como BLOB en un SQLite db no le ahorrará espacio alguno y no los almacenará como archivos. Si estos archivos no están destinados a ser asociados a ningún dato dinámico, simplemente los colocaría en carpetas de activos, de esa manera se compilarán en la APK y podría ser un poco más rápido recuperarlos si estuvieran en una base de datos.

+0

Hola Ricardo, gracias por tu respuesta. Si almaceno mis archivos en la carpeta de activos, entonces mi tamaño de aplicación aumenta, ¿es esa la solución factible? por favor comenta sobre esto. o hay alguna forma de almacenar el archivo de audio en un formato de bajo consumo? –

+0

Si almacena sus archivos en su base de datos, el tamaño de su aplicación también aumentará, no veo cómo podría hacerlo sin incluir más bytes sin aumentar el tamaño ... Podría intentar comprimirlos pero no ganaría mucho ya que los archivos de música ya están muy comprimidos ... –

+0

@ Vinayak-Bevinakatti, si está preocupado por el tamaño del APK, puede ser que pueda descargar esos archivos de un servidor cuando su aplicación se ejecute por primera vez. – Rajeev

0

¿Cuál es la motivación para almacenar los archivos en sql lite db? No veo mucho beneficio al almacenar la ruta del archivo en el archivo db, y el archivo real en el sistema de archivos ...

+0

Hola Ben, Gracias por su respuesta. Si almaceno mis archivos en la carpeta de activos, el tamaño de mi aplicación aumenta, ¿es esa la solución factible? por favor comenta sobre esto. o hay alguna forma de almacenar el archivo de audio en un formato de bajo consumo. –

+1

sí, pero almacenarlo en el db no le ahorrará ningún espacio ... – Ben

1

Alguien me corrige si estoy equivocado, pero SQLite tiene una restricción del tamaño total de la fila < 1024kb. Si todos sus archivos de audio son lo suficientemente pequeños, puede almacenarlos como BLOB.

+0

No creo que sea cierto. https://stackoverflow.com/questions/26968537/maximum-sqlite-size-using-blob – Suragch

4

tratar el siguiente código ... se almacena para mí .....

@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 razón principal para el almacenamiento de archivos de sonido en la base de datos podría ser el enfoque línea de productos. Puede desarrollar muchas aplicaciones similares simplemente modificando su base de datos y sin tocar su código.

No hago ningún comentario sobre el tamaño de la aplicación porque hay comentarios al respecto y no lo veo.

Sí. Puede almacenar sus archivos de sonido de pequeño tamaño en la base de datos sqlite como campos de blob. Funciona bien. Primero almacene sus datos en la base de datos luego recupérelos y póngalos en un archivo temporal. De esta forma puede almacenar sus archivos de sonido en la base de datos.

Comprobar esto:

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