我正在构建一个ios应用程序,其中sqlite文件被启动一次并在所有sqlite事务中使用;它是为了节省性能。 它被定义为:
static sqlite3 *dbName = nil;
在函数中,我将数据库初始化为:
-(int)initialize:(NSString *)dbPath{
if (sqlite3_open_v2(dbPath, &dbName, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) == SQLITE_OK) {
//some codes
}
}
在一些事务之后,我发现sqlite3实例为NULL并且app崩溃了。我想知道是否有办法检查sqlite3实例是否已取消分配。
答案 0 :(得分:0)
我可以看到两个潜在的问题:
您正在多次打开数据库,并最终(我不能说何时)放弃并设置NULL
的句柄。这是因为你没有防止多次打开它。
您的代码显示sqlite3_open_v2(dbPath, &dbPath, ...
,但这不是正确的。名称dbName
也没有很好地选择。
这应该可以解决大部分问题:
-(int)initialize:(NSString *)dbPath{
if (dbName == NULL) {
if (sqlite3_open_v2(dbPath, &dbName, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) == SQLITE_OK) {
//some codes
}
}
}
您最好使用单例模式,而不是static
,因为它更清晰。