sqlite3_open:"无法打开数据库文件"

jdl*_*jdl 3 c sqlite cocoa-touch

执行rc = sqlite3_open("test.db",&db)时,我"无法打开数据库文件"; ??

sqlite3 *db; // sqlite3 db struct
char *zErrMsg = 0;
int rc;

// Open the test.db file
rc = sqlite3_open("test.db", &db); // <-- creates DB if not found ??

if( rc ){
    // failed
    fprintf(stderr, "ERROR: Can't open database: %s\n", sqlite3_errmsg(db));
} 
Run Code Online (Sandbox Code Playgroud)

Eva*_*ski 10

sqlite3_open如果数据库尚不存在,则返回错误.要创建数据库,如果它不存在,请sqlite3_open_v2SQLITE_OPEN_CREATESQLITE_OPEN_READWRITE标志(两者都需要):

rc = sqlite3_open_v2(/* DB Path */, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
Run Code Online (Sandbox Code Playgroud)

参考


要查找/* DB PATH */,您需要将文件名基于文档目录:

- (NSString *) applicationDocumentsDirectory 
{    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}
Run Code Online (Sandbox Code Playgroud)

您可以使用此便捷方法将文档路径与数据库名称组合在一起:

NSString *documents = [self applicationDocumentsDirectory];
NSString *dbPath = [documents stringByAppendingPathComponent:@"test.db"];

rc = sqlite3_open_v2([dbPath UTF8String], &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
Run Code Online (Sandbox Code Playgroud)

  • 自 2012 年以来情况可能发生了变化,我不确定,但目前文档指出`sqlite3_open()` 默认情况下执行 READWRITE 和 CREATE 标志:https://www.sqlite.org/c3ref/open.html (2认同)