gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:04:07 25 4
gpt4 key购买 nike

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

最佳答案

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

您收到“内存不足”错误的原因是 sqlite3_open 正在更新 newDBConnection,但 sqlite3_errmsg 正在尝试使用 db(仍然是 NULL)。每当您调用 sqlite3_errmsg 并为 sqlite3 指针设置一个 NULL 时,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 来获取刚刚返回的代码.

关于ios - 由于内存不足错误无法打开 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25370238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com