2010-07-02 7 views
6

응용 프로그램을 개발 중입니다. 적어도 각각의 텍스트에 대해 재생할 수있는 최소 400 개의 오디오 파일을 사용해야합니다. 내 질문은이 최선 및 최적화 된 방법은 무엇입니까?데이터베이스에 오디오 파일 저장

한 가지 해결책은 모든 오디오 파일을 리소스 폴더에두고 거기에서 참조하는 것입니다. 응용 프로그램 크기가 증가함에 따라 이는 결코 실현 가능한 솔루션이 아닙니다. 어떤 형식으로 오디오 파일을 변환하고 SQLite 데이터베이스에 덤프하고 유연하게 검색 할 수있는 방법이 있습니까? 그렇다면 어떤 옵션이 있습니까?

답변

4

SQLite db에 파일을 BLOB로 저장해도 공간을 저장하는 것이 아니라 파일로 저장하는 것이 저장됩니다. 이 파일들이 어떤 동적 데이터와도 관련이 없으면 애셋 폴더에 넣을 것입니다. 그러면 APK로 컴파일되고 DB에있는 경우 검색하는 것이 더 빠를 수도 있습니다.

+0

안녕하세요, 리카르도, 답장을 보내 주셔서 감사합니다. 내 파일을 자산 폴더에 저장하면 응용 프로그램 크기가 늘어납니다. 실현 가능한 솔루션입니까? 이것에 대해 의견을 말하십시오. 또는 낮은 소비 형식으로 오디오 파일을 저장할 수있는 방법은 무엇입니까 ?? –

+0

DB에 파일을 저장하면 앱 크기도 커지고 크기를 늘리지 않고도 더 많은 바이트를 포함 할 수있는 방법을 알지 못합니다. 파일을 압축 할 수는 있지만 많이 얻을 수는 없습니다. 음악 파일이 이미 매우 압축되어 있기 때문에 ... –

+0

@ Vinayak-Bevinakatti, APK 크기에 대해 걱정하는 경우 앱을 처음 실행할 때 서버에서 파일을 다운로드 할 수 있습니다. – Rajeev

0

sql lite db에 파일을 저장하는 동기는 무엇입니까? db 디렉토리의 파일 경로와 파일 시스템의 실제 파일을 저장하는 것보다 많은 이점을 얻지 못합니다 ...

+0

안녕 벤, 답장을 보내 주셔서 감사합니다. 내 파일을 자산 폴더에 저장하면 응용 프로그램 크기가 늘어납니다. 실현 가능한 솔루션입니까? 이것에 대해 의견을 말하십시오. 또는 오디오 파일을 저소비 전력 형식으로 저장하는 방법이 있습니다. –

+1

네,하지만 db에 저장하면 실망하지 않을 것입니다. – Ben

1

내가 틀렸다면 아무도 저를 고치지 만 SQLite는 총 행 크기의 제한을받습니다 < 1024kb. 모든 오디오 파일이 충분히 작 으면 BLOB로 저장할 수 있습니다.

+0

나는 그것이 사실이라고 생각하지 않습니다. https://stackoverflow.com/questions/26968537/maximum-sqlite-size-using-blob – Suragch

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


    } 
}); 
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(); 
관련 문제