データベースにオーディオファイルを保存します
-
02-10-2019 - |
質問
アプリケーションを開発しています。それぞれのテキストで再生できる少なくとも400個のオーディオファイルを使用する必要があります。私の質問は、これを行うための最良かつ最適化された方法はどれですか?
ソリューションの1つは、すべてのオーディオファイルをリソースフォルダーに配置し、そこから参照することです。アプリケーションサイズが増加するため、これは実行可能なソリューションになることはありません。オーディオファイルを何らかの形式に変換してSQLiteデータベースにダンプして柔軟に取得する方法はありますか?もしそうなら、私はどのようなオプションを持っていますか?
解決
ファイルをSQLite DBにBLOBとして保存しても、それらをファイルとして保存するスペースとそれらを保存しません。これらのファイルが動的なデータに関連付けられることを意図していない場合、私はそれらをAssetsフォルダーに配置するだけです。
他のヒント
次のコードを試してみてください...それは私のために保存されています.....
@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();
}
});
私が間違っている場合は誰でも私を修正しますが、SQLiteには合計行サイズが1024kb未満の制限があります。すべてのオーディオファイルが十分に小さい場合は、それらをブロブとして保存できます。
データベースにサウンドファイルを保存する主な理由は、製品ラインアプローチかもしれません。データベースを変更してコードに触れないだけで、多くの同様のアプリケーションを開発できます。
アプリケーションサイズについてはコメントしません。なぜなら、それについてコメントがあり、見ていないからです。
はい。 Sqliteデータベースに小さなサイズのサウンドファイルをBlobフィールドとして保存できます。うまくいきます。最初にデータベースにデータを保存してから、それを取得してTEMPファイルに入れます。そうすれば、サウンドファイルをデータベースに保存できます。
これをチェックして:
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();
SQL Lite DBにファイルを保存する背後にある動機は何ですか? DBのファイルパスとファイルシステムの実際のファイルを保存することについて、それにはあまり利益がありません...