由于内存不足错误无法打开SQLite数据库

时间:2014-08-18 18:59:48

标签: ios objective-c sqlite

我在为我正在写的iPhone应用程序打开我的sqlite数据库时遇到问题。我以为我一字不差地按照教程,但由于某种原因,我得到了一个"内存不足"错误。

-(NSString *) filepath{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
    return [[paths objectAtIndex:0] stringByAppendingPathComponent:@"db.sqlite"];
}

-(sqlite3*)openDB{
    if(db == NULL){
        sqlite3 *newDBConnection;

        if(sqlite3_open([[self filepath] UTF8String], &newDBConnection) != SQLITE_OK){
            sqlite3_close(db);
            NSLog(@"%s SQL error '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(db), sqlite3_errcode(db));
            db = NULL;
        }
        else{
            NSLog(@"db opened");
        }

    }
    return db;
}

DB是一个ivar,我在初始化方法中调用db = [self openDB];

1 个答案:

答案 0 :(得分:3)

sqlite3_open失败了,因为您使用的是NSDocumentationDirectory而不是NSDocumentDirectory

您收到“内存不足”错误的原因是sqlite3_open正在更新newDBConnection,但sqlite3_errmsg正在尝试使用db(这是还是NULL)。每当你使用sqlite3_errmsg NULL指针调用sqlite3时,SQLite会有点混乱地返回“内存不足”消息。

另请注意,即使您解决了上述两个问题,请注意您在执行sqlite3_errmsg后呼叫sqlite3_close。在致电sqlite3_close之前,请务必收到错误消息。

E.g。我建议:

- (BOOL)openDB {
    if (db == NULL) {
        int rc;
        if ((rc = sqlite3_open([[self filepath] UTF8String], &db)) != SQLITE_OK) {
            NSLog(@"%s SQL error '%s' (%d)", __FUNCTION__, sqlite3_errmsg(db), rc);
            sqlite3_close(db);
            db = NULL;
            return false;        // open failed
        } else {
            NSLog(@"db opened");
            return true;         // open successful
        }
    }
    return true;                 // already open
}

注意,一个小问题,假设sqlite3_open返回错误代码,我只是直接保存它,而不是调用sqlite3_errcode来获取刚刚返回的代码。