2010-07-02 6 views
6

Je suis en train de développer une application. J'ai besoin d'utiliser au moins 400 fichiers audio qui peuvent être lus pour certains textes respectifs. Ma question est quelle est la meilleure et la meilleure façon de faire cela?Stockage d'un fichier audio dans une base de données

Une solution consiste à placer tous les fichiers audio dans le dossier des ressources et à s'y référer. Ce ne sera jamais une solution réalisable car la taille de l'application va augmenter. Existe-t-il un moyen de convertir le fichier audio dans un format et de le vider dans la base de données SQLite et de les récupérer de manière flexible? Si oui, quelles options ai-je?

Répondre

4

Le stockage des fichiers en tant que BLOB dans une base de données SQLite ne vous économisera aucun espace et ne les stockera pas en tant que fichiers. Si ces fichiers ne sont pas destinés à être associés à des données dynamiques, je les mettrais simplement dans des dossiers d'actifs, de cette façon ils seront compilés dans l'APK et pourraient être un peu plus rapides à récupérer s'ils étaient dans une base de données.

+0

Salut Ricardo, Merci pour votre réponse. Si je stocke mes fichiers dans le dossier des ressources, la taille de l'application augmente. Est-ce la solution possible? veuillez commenter ceci. ou existe-t-il un moyen de stocker le fichier audio dans un format à faible consommation? –

+0

Si vous stockez vos fichiers dans votre base de données, votre taille d'application augmentera également, je ne vois pas comment vous pourriez vous en sortir avec plus d'octets sans augmenter la taille ... Vous pourriez essayer de les compresser mais vous ne gagnerez pas beaucoup puisque les fichiers musicaux sont déjà fortement compressés ... –

+0

@ Vinayak-Bevinakatti, si vous vous inquiétez de la taille du fichier APK, il se peut que vous puissiez télécharger ces fichiers depuis un serveur lorsque votre application est exécutée pour la première fois. – Rajeev

0

Quelle est la motivation derrière le stockage des fichiers dans le sql lite db? Je ne vois pas beaucoup d'avantages à cela sur le stockage du chemin de fichier dans le db, et le fichier réel sur le système de fichiers ...

+0

Salut Ben, Merci pour votre réponse. Si je stocke mes fichiers dans le dossier des ressources, la taille de l'application augmente. Est-ce la solution envisageable? veuillez commenter ceci. ou existe-t-il un moyen de stocker le fichier audio dans un format à faible consommation. –

+1

oui mais le stocker dans le db wont vous faire économiser de l'espace ... – Ben

1

Tout le monde me corriger si je me trompe, mais SQLite a une restriction de la taille totale des lignes < 1024kb. Si tous vos fichiers audio sont assez petits, vous pouvez les stocker en tant que BLOB.

+0

Je ne pense pas que ce soit vrai. https://stackoverflow.com/questions/26968537/maximum-sqlite-size-using-blob – Suragch

4

essayez le code suivant ... il stocké pour moi .....

@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 raison principale pour stocker des fichiers audio sur la base de données pourrait être l'approche de la ligne de produits. Vous pouvez développer de nombreuses applications similaires en modifiant simplement votre base de données et en ne touchant pas votre code.

Je ne commente pas la taille de l'application car il y a des commentaires à ce sujet et je ne la regarde pas.

Oui. Vous pouvez stocker vos fichiers audio de petite taille dans la base de données sqlite sous forme de champs blob. Ça marche bien. Commencez par stocker vos données dans la base de données, puis récupérez-les et placez-les dans un fichier temporaire. De cette façon, vous pouvez stocker vos fichiers audio dans la base de données.

Vérifiez ceci:

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