Ios NSData到*.caf文件

Ios NSData到*.caf文件,ios,sqlite,nsdata,caf,Ios,Sqlite,Nsdata,Caf,我正试图在我的SQLite数据库中保存一个音频文件,并将其还原 我以这种方式将数据存储到NSData: NSData *audioData = [NSData dataWithContentsOfFile:[audios objectAtIndex:A]]; insert_stmt = "INSERT INTO audios (fecha, audio) VALUES (?, ?)"; if( sqlite3_prepare_v2(contactDB, insert_stmt, -1, &am

我正试图在我的
SQLite数据库中保存一个音频文件,并将其还原

我以这种方式将数据存储到
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 Kb时,您使用了错误的列索引。在要加载所用数据的查询中:

SELECT fecha, audio FROM audios WHERE fecha = XXX;
这意味着您需要使用列索引1而不是2来访问
audio


这是
sqlite3
C-API中最糟糕的部分。
sqlite3\u bind\u xxx
函数使用基于1的列索引,而
sqlite3\u column\u xxx
函数使用基于0的列索引。

将这样的数据文件保存到SQLite是非常不寻常的。通常人们保存这些文件,然后只存储指向该文件的链接。显示用于读取数据的查询。请记住,
sqlite3\u column\u xxx
的列索引是基于0的,而
sqlite3\u bind\u xxx
的索引是基于1的。@HalR,您通常是对的,只需将文件和路径保存在数据库中,但在这种情况下,我在数据库中工作得最好。@rmaddy这是查询:NSString*ConsultaSQL=[NSString stringWithFormat:@“选择fecha,音频来自音频,其中fecha='%@',fecha];sqlite3_stmt*SQLstatement;query_stmt=[ConsultaSQL UTF8String];sqlite3_prepare_v2(contactDB,query stmt,-1,&SQLstatement,NULL);您是否检查了sqlite数据文件以确保数据正确位于其中?(我不想问,但您永远不知道)你拯救了这一天。现在我可以创建*.Caf、@rmaddy和HalR了。非常感谢你的帮助