Ios Can';由于内存不足错误,无法打开SQLite数据库
我在为正在编写的iPhone应用程序打开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正在尝试使用
DB是一个ivar,我正在调用
DB=[self-openDB]初始化方法中的code>。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
}