【问题标题】:sqlite3_open: "unable to open database file"sqlite3_open:“无法打开数据库文件”
【发布时间】:2015-04-07 22:40:33
【问题描述】:

执行 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));
} 

【问题讨论】:

    标签: c cocoa-touch sqlite


    【解决方案1】:

    sqlite3_open 如果数据库尚不存在,则返回错误。要创建尚不存在的数据库,请将sqlite3_open_v2SQLITE_OPEN_CREATESQLITE_OPEN_READWRITE 标志一起使用(两者都是必需的):

    rc = sqlite3_open_v2(/* DB Path */, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
    

    Reference


    要查找/* DB PATH */,您需要将文件名作为文档目录的基础:

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

    您可以使用这种方便的方法将文档路径与数据库名称结合起来:

    NSString *documents = [self applicationDocumentsDirectory];
    NSString *dbPath = [documents stringByAppendingPathComponent:@"test.db"];
    
    rc = sqlite3_open_v2([dbPath UTF8String], &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
    

    【讨论】:

    • 谢谢我试过了,得到“错误:无法打开数据库:内存不足”??
    • test.db 在哪里(或应该创建)?
    • 我的理解是如果文件不存在,它会创建它?
    • 可以,但是只能写入documents目录,所以路径需要基于那里。
    • 事情可能自 2012 年以来发生了变化,我不确定,但目前文档指出 sqlite3_open() 默认情况下会使用 READWRITE 和 CREATE 标志:sqlite.org/c3ref/open.html
    【解决方案2】:
    #define SQLITE_OK 0
    sqlite3 *db;
    char *zErrMsg=0;
    if(sqlite3_open("demo.db", &db) == SQLITE_OK)
    {
        if(sqlite3_exec(db, "select * from Users", callback, 0, &zErrMsg) == SQLITE_OK)
                msgbox1("success");
        sqlite3_close(db);
    }
    else
        msgbox1("failure");
    

    这是我使用的示例代码;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-09
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 2014-08-30
      • 2011-03-17
      相关资源
      最近更新 更多