这是我的代码
- (void) SaveImagesToSql: (NSData*) imgData {
// NSLog( @"\n*****Save image to SQLite*****\n" );
sqlite3 *sqlite3DatabaseObject;
sqlite3_stmt* sqlite3Statement;
NSString *databasePath = [self.documentsDirectory stringByAppendingPathComponent:self.databaseFilename];
const char* sqlite3Query = "INSERT INTO ABCD (image) VALUES (?)";
BOOL openDatabaseResult = sqlite3_open_v2([databasePath UTF8String], &sqlite3DatabaseObject, -1, sqlite3Query);
if (openDatabaseResult == SQLITE_OK) {
sqlite3_stmt* sqlite3Statement;
BOOL sqlite3Prepare = sqlite3_prepare_v2(sqlite3DatabaseObject, sqlite3Query, -1, &sqlite3Statement, NULL);
if( sqlite3Prepare == SQLITE_OK ) {
sqlite3_bind_blob(sqlite3Statement, 1, [imgData bytes], [imgData length], SQLITE_TRANSIENT);
sqlite3_step(sqlite3Statement);
}
}
else NSLog( @"SaveBody: Failed from sqlite3_prepare_v2. Error is: %s", sqlite3_errmsg(sqlite3DatabaseObject) );
sqlite3_finalize(sqlite3Statement);
}
并抛出错误:
SaveBody:sqlite3_prepare_v2失败。错误是:内存不足
有谁可以帮我解决这个问题。
提前致谢。
编辑:
现在我已经修复了sqlite3_open_v2
个问题以及下面列出的一些其他问题,我现在收到一条不同的错误消息:
SaveBody:准备失败:没有这样的表:ABCD
这是我修改后的代码:
- (void) SaveImagesToSql: (NSData*) imgData {
// NSLog( @"\n*****Save image to SQLite*****\n" );
sqlite3 *sqlite3DatabaseObject;
sqlite3_stmt* sqlite3Statement;
NSString *databasePath = [self.documentsDirectory stringByAppendingPathComponent:@"picdb.sqlite"];
const char* sqlite3Query = "INSERT INTO ABCD (image) VALUES (?)";
int openDatabaseResult = sqlite3_open_v2([databasePath UTF8String], &sqlite3DatabaseObject, SQLITE_OPEN_READWRITE , NULL);
// int openDatabaseResult = sqlite3_open_v2([databasePath UTF8String], &sqlite3DatabaseObject, -1, sqlite3Query);
if (openDatabaseResult == SQLITE_OK) {
sqlite3_stmt* sqlite3Statement;
int sqlite3Prepare = sqlite3_prepare_v2(sqlite3DatabaseObject, sqlite3Query, -1, &sqlite3Statement, NULL);
if( sqlite3Prepare == SQLITE_OK ) {
sqlite3_step(sqlite3Statement);
sqlite3_bind_blob(sqlite3Statement, 1, [imgData bytes], [imgData length], SQLITE_TRANSIENT);
}
else
{
NSLog(@"Prepare failure: %s", sqlite3_errmsg(sqlite3DatabaseObject));
}
}
else NSLog( @"SaveBody: Failed from sqlite3_prepare_v2. Error is: %s", sqlite3_errmsg(sqlite3DatabaseObject) );
sqlite3_finalize(sqlite3Statement);
}
答案 0 :(得分:1)
有几个问题:
日志声明表示它正在记录sqlite3_prepare_v2
错误,但事实并非如此。它记录了sqlite3_open_v2
个错误。
sqlite3_open_v2
失败,原因是:
第三个参数无效(它应该是您需要的标志,例如SQLITE_OPEN_READWRITE
或其他);和
您为最后一个参数提供了指向sqlite3Query
的指针,但这不是第四个参数的用途。
有关详细信息,请参阅documentation for sqlite3_open_v2
。
由于sqlite3_errmsg
未传递有效的数据库指针,因此会出现误导性的“内存不足”错误。显然,由于打开失败,您没有有效的数据库指针,因此您无法使用sqlite3_errmsg
打开失败。只需记录openDatabaseResult
值。
请注意,这些sqlite3_xxx
函数不会返回BOOL
。他们返回int
。对于sqlite3_open_v2
,检查返回值是诊断正在发生的事情的唯一方法,如果使用BOOL
,则可能会丢失重要的数值。