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

4

我在编写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];


2
在关闭数据库之前记录错误。并使用NSFileManager确认db.sqlite文件是否存在。 - rmaddy
这是您在应用程序中第一次打开SQLite,还是在运行一段时间后发生的? - Hot Licks
@Hot Licks- 这是我第一次在应用程序中打开SQLite。我无法在第一次打开时将其打开。 - ddresner8
@rmaddy - 如果文件不存在,sqlite3_open 不会创建该文件吗?这是我在教程中了解到的。 - ddresner8
你能否在Mac命令行中使用sqlite3打开文件? - Hot Licks
请提供“确切的”错误信息并进行引用。 - Hot Licks
1个回答

4
sqlite3_open失败是因为你使用了NSDocumentationDirectory而不是NSDocumentDirectory
你收到“内存不足”错误的原因是sqlite3_open正在更新newDBConnection,但sqlite3_errmsg正在尝试使用db(它仍然是NULL)。每当你使用一个空的sqlite3指针调用sqlite3_errmsg时,SQLite会有点混乱地返回一个“内存不足”的消息。
另外请注意,即使你解决了上述两个问题,请注意在执行sqlite3_close之后调用sqlite3_errmsg。确保在调用sqlite3_close之前获取错误消息。
例如,我建议:
- (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来获取刚刚返回的代码。


1
就是这样!非常感谢,简直不敢相信我没有发现那个。 - ddresner8
1
谢谢@Rob,我看到了你的代码示例,目前正在使用!非常感谢。 - ddresner8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接