8

我正在开发一个应用程序。我需要使用至少 400 个音频文件,这些文件可以播放一些相应的文本。我的问题是哪种方法是最好的和优化的方法?

一种解决方案是将所有音频文件放在资源文件夹中并从那里引用。随着应用程序大小的增加,这永远不会是一个可行的解决方案。有没有什么办法可以将音频文件转换成某种格式转储到SQLite数据库中灵活检索?如果是这样,我有什么选择?

4

5 回答 5

6

将文件作为 BLOB 存储在 SQLite 数据库中与将它们存储为文件相比,不会为您节省任何空间。如果这些文件不打算与任何动态数据相关联,我只需将它们放在资产文件夹中,这样它们就会被编译到 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

如果我错了,任何人都可以纠正我,但 SQLite 的总行大小限制为 < 1024kb。如果您的所有音频文件都足够小,您可以将它们存储为 BLOB。

于 2010-07-02T15:11:57.840 回答
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 回答
0

将文件存储在 sql lite db 中的动机是什么?与将文件路径存储在数据库中以及文件系统上的实际文件相比,我没有看到太多好处......

于 2010-07-02T14:58:43.473 回答