sqlite3_prepare_v2失败。错误是:内存不足

时间:2017-04-10 11:11:59

标签: ios objective-c sqlite out-of-memory

这是我的代码

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

1 个答案:

答案 0 :(得分:1)

有几个问题:

  1. 日志声明表示它正在记录sqlite3_prepare_v2错误,但事实并非如此。它记录了sqlite3_open_v2个错误。

  2. sqlite3_open_v2失败,原因是:

    • 第三个参数无效(它应该是您需要的标志,例如SQLITE_OPEN_READWRITE或其他);和

    • 您为最后一个参数提供了指向sqlite3Query的指针,但这不是第四个参数的用途。

    有关详细信息,请参阅documentation for sqlite3_open_v2

  3. 由于sqlite3_errmsg未传递有效的数据库指针,因此会出现误导性的“内存不足”错误。显然,由于打开失败,您没有有效的数据库指针,因此您无法使用sqlite3_errmsg打开失败。只需记录openDatabaseResult值。

  4. 请注意,这些sqlite3_xxx函数不会返回BOOL。他们返回int。对于sqlite3_open_v2,检查返回值是诊断正在发生的事情的唯一方法,如果使用BOOL,则可能会丢失重要的数值。