我在为我正在写的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];
。
答案 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
来获取刚刚返回的代码。