2012-06-28 220 views
2

執行rc = sqlite3_open(「test.db」,& db)時出現「無法打開數據庫文件」; ??sqlite3_open:「無法打開數據庫文件」

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

回答

10

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); 
+0

謝謝我曾嘗試過,並得到「錯誤:無法打開數據庫:內存不足」? – jdl

+0

「test.db」位於哪裏(或應該創建)? –

+1

我的理解是,如果文件不存在,它會創建它? – jdl

-1
#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"); 

這裏是我使用的示例代碼;

相關問題