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

Ios Can';由于内存不足错误,无法打开SQLite数据库,ios,objective-c,sqlite,Ios,Objective C,Sqlite,我在为正在编写的iPhone应用程序打开sqlite数据库时遇到问题。我原以为我一字不差地听了教程,但由于某种原因,我得到了一个“内存不足”的错误 DB是一个ivar,我正在调用DB=[self-openDB]。sqlite3\u open失败,因为您使用的是NSDocumentationDirectory而不是NSDocumentDirectory 您收到“内存不足”错误的原因是sqlite3\u open正在更新newDBConnection,但是sqlite3\u errmsg正在尝试使用

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


DB是一个ivar,我正在调用
DB=[self-openDB]
sqlite3\u open
失败,因为您使用的是
NSDocumentationDirectory
而不是
NSDocumentDirectory

您收到“内存不足”错误的原因是
sqlite3\u open
正在更新
newDBConnection
,但是
sqlite3\u errmsg
正在尝试使用
db
(仍然是
NULL
)。无论何时使用
sqlite3
指针的
NULL
调用
sqlite3\u errmsg
,SQLite都会令人困惑地返回一条“内存不足”消息

还要注意的是,即使您解决了上述两个问题,也要注意在执行
sqlite3\u close
之后调用的是
sqlite3\u errmsg
。在调用
sqlite3\u 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\u open
返回错误代码,我将直接保存它,而不是调用
sqlite3\u errcode
来获取刚刚返回的代码。

在关闭数据库之前记录错误。并使用
NSFileManager
确认
db.sqlite
文件实际存在。这是您第一次在应用程序中打开sqlite,还是在您运行了一段时间后才打开?@Hot Licks-这是我第一次在应用程序中打开sqlite。我无法在第一次打开它。@rmaddy-如果文件不存在,sqlite3\u是否打开并生成该文件?这是我在教程之后被告知的。你能从Mac命令行用
sqlite3
打开文件吗?就是这样!非常感谢你,真不敢相信我没听懂。谢谢@Rob,我看到了你的代码示例及其当前使用的代码!非常感谢
- (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
}