8

私はアプリケーションを開発しています。それぞれのテキストで再生できる少なくとも 400 のオーディオ ファイルを使用する必要があります。私の質問は、これを行うための最良かつ最適化された方法はどれですか?

解決策の 1 つは、すべてのオーディオ ファイルを resources フォルダーに配置し、そこから参照することです。アプリケーションのサイズが大きくなるため、これは決して実現可能なソリューションではありません。オーディオ ファイルを何らかの形式に変換し、SQLite データベースにダンプして柔軟に取得する方法はありますか? もしそうなら、どのようなオプションがありますか?

4

5 に答える 5

6

ファイルを BLOB として SQLite db に保存しても、ファイルとして保存するよりもスペースを節約できません。これらのファイルが動的データに関連付けられることを意図していない場合は、アセット フォルダーに配置するだけで、APK にコンパイルされ、データベースにある場合は取得が少し速くなる可能性があります。

于 2010-07-02T17:05:15.317 に答える
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();


    }
});
于 2012-08-24T09:38:17.953 に答える
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();
于 2016-04-05T07:48:16.617 に答える
1

私が間違っていれば誰でも訂正してくれますが、SQLite には合計行サイズ < 1024kb という制限があります。すべてのオーディオ ファイルが十分に小さい場合は、それらを BLOB として保存できます。

于 2010-07-02T15:11:57.840 に答える
0

ファイルを sql lite db に保存する動機は何ですか? ファイルパスをデータベースに保存し、実際のファイルをファイルシステムに保存するよりも、それほどメリットはありません...

于 2010-07-02T14:58:43.473 に答える