2013-10-24 1 views
1

오디오 파일을 내 SQLite DB에 저장하고 복원하려고합니다.NSData to * .caf 파일

나는 NSData에 이런 식으로 저장 :

NSData *audioData = [NSData dataWithContentsOfFile:[audios objectAtIndex:A]]; 
insert_stmt = "INSERT INTO audios (fecha, audio) VALUES (?, ?)"; 

if(sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL) == SQLITE_OK) 
{ 
    sqlite3_bind_text(statement, 1, [Fecha UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_blob(statement, 2, [audioData bytes], [audioData length], SQLITE_TRANSIENT); 
    sqlite3_step(statement); 
} 
else NSLog(@"SaveBody: Failed from sqlite3_prepare_v2. Error is: %s", sqlite3_errmsg(contactDB)); 
sqlite3_finalize(statement); 

그리고이 방법으로 그것을 다시 얻을 :

while (sqlite3_step(SQLstatement) == SQLITE_ROW) 
{ 
    int length = sqlite3_column_bytes(SQLstatement, 2); 
    NSData* data = nil; 
    data  = [NSData dataWithBytes:sqlite3_column_blob(SQLstatement, 2) length:length]; 

    NSArray *dirPaths; 
    NSString *docsDir; 

    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    docsDir = [dirPaths objectAtIndex:0]; 

    NSString *ruta = [NSString stringWithFormat:@"%@-%d-sound.caf", fecha, contador]; 
    NSString *soundFilePath = [docsDir stringByAppendingPathComponent:ruta]; 

    [[NSFileManager defaultManager] createFileAtPath:soundFilePath contents:data attributes:nil]; 
} 

하지만 난 단지 0 이하

+0

이처럼 데이터 파일을 SQLite에 저장하는 것은 매우 드문 일입니다. 대개 사람들은이 파일들을 저장하고 파일에 대한 링크를 저장합니다. – HalR

+1

데이터 읽기에 대한 조회를 표시하십시오. 'sqlite3_column_xxx'의 컬럼 인덱스는 0 기반이고'sqlite3_bind_xxx'의 인덱스는 1 기반이라는 것을 명심하십시오. – rmaddy

+0

@ HalR, 대개 파일과 경로를 DB에 저장하면되지만,이 경우에는 DB에서 모두 최선을 다합니다. –

답변

0

이 들어있는 오디오 파일을 만들 때 앞에서 설명한 것처럼 잘못된 열 인덱스를 사용하고 있습니다. 데이터를로드하는 쿼리에서는 사용이 당신이 audio 열을 액세스하기 위해 열 인덱스 1이 아니라 2를 사용할 필요가 의미

SELECT fecha, audio FROM audios WHERE fecha = XXX; 

.

이것은 C-API sqlite3의 최악의 부분입니다. sqlite3_bind_xxx 함수는 1 기반 열 인덱스를 사용하고 sqlite3_column_xxx 함수는 0 기반 열 인덱스를 사용합니다.

+0

오늘을 저장했습니다. 이제는 *를 만들 수 있습니다. Caf, @rmaddy 및 HalR이 도움을 주셔서 대단히 감사합니다. –