Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 检查sqlite3数据库是否为空_Ios_Objective C_Sqlite - Fatal编程技术网

Ios 检查sqlite3数据库是否为空

Ios 检查sqlite3数据库是否为空,ios,objective-c,sqlite,Ios,Objective C,Sqlite,我正在构建一个ios应用程序,其中sqlite文件启动一次,并在所有sqlite事务中使用;这样做是为了节省性能。 其定义如下: static sqlite3 *dbName = nil; 在函数中,我将数据库初始化为: -(int)initialize:(NSString *)dbPath{ if (sqlite3_open_v2(dbPath, &dbName, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) == SQL

我正在构建一个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实例为空,应用程序崩溃。我想知道是否有办法检查sqlite3实例是否已解除分配。

我可以看到两个潜在问题:

  • 您多次打开数据库,最终(我不能说何时)它放弃并将句柄设置为
    NULL
    。这是因为您没有防止多次打开它

  • 您的代码显示的是
    sqlite3\u open\u 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
    ,因为它更干净。

    static?您不应该使用单例模式类,即
    DatabaseManager
    ,并将实例保留在该类中,以确保它保持其状态,并且可以在整个应用程序中访问吗?我会照您所说的做。Thanks