2011-04-26 44 views
1

下面是代碼...任何人看到有什麼問題?另外,爲什麼的「ERRMSG」第二個的NSLog導致調試調試到設備時崩潰(iPhone 3GS)嘗試打開(創建)SQLite時出錯(「EXC_BAD_ACCESS」)d/b

// Get the path to the database file 
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentPath = [searchPaths objectAtIndex:0]; 
NSString *databasePath = [documentPath stringByAppendingPathComponent:@"ppcipher.s3db"]; 
const char *cDatabasePath = [databasePath cStringUsingEncoding:NSUTF8StringEncoding]; 
    NSLog(@"databasePath: %@", databasePath); 

    NSString *sqlCommand = @"CREATE TABLE CardData (card_id TEXT PRIMARY KEY NOT NULL, card_name TEXT NOT NULL, " 
     @"card_type TEXT, cide_val TEXT, create_date TEXT DEFAULT CURRENT_DATE, user_notes TEXT, gps_loc TEXT)"; 
    const char cSQLCommand = [sqlCommand cStringUsingEncoding:NSUTF8StringEncoding]; 
    char * errmsg = NULL; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    [fileManager removeItemAtPath:databasePath error:NULL]; // <------------ delete d/b TESTING ONLY! 

    BOOL fileExists = [fileManager fileExistsAtPath:databasePath]; 
    if(!fileExists) { 
     if(sqlite3_open(cDatabasePath, db) == SQLITE_OK) { // doesn't exist, so create it... 
      sqlite3_exec(db, &cSQLCommand, NULL, NULL, &errmsg); // now create the table... 
      NSLog(@"error: %@", errmsg); 
     } 
+0

只有受虐者直接在Objective-C中使用SQLite C API。 [使用FMDB](http://github.com/ccgus/fmdb)(一個SQLite包裝器)或[CoreData](http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreData/ cdProgrammingGuide.html)(一個對象圖管理器)。 – 2011-04-26 20:36:47

+0

我尊重你的意見......但是,我選擇直接使用API​​,主要是學習......你能告訴我爲什麼我得到sqlite3_open錯誤嗎? – SpokaneDude 2011-04-26 20:49:37

+0

編輯我的答案。 – 2011-04-26 21:15:51

回答

2

它崩潰,因爲errmsg不是一個Objective-C的對象,你被要求您使用%@替代。 errmsgchar *,這意味着您應該使用%s

int sqlite3_open(
    const char *filename, /* Database filename (UTF-8) */ 
    sqlite3 **ppDb   /* OUT: SQLite db handle */ 
); 

db聲明爲sqlite3*

至於爲什麼它的崩潰....

sqlite3_open的定義。換句話說,你傳遞錯誤的事情,你應該做的事:

sqlite3_open(cDatabasePath, &db) 

當你渴望瞭解SQLite的C API是偉大的,我仍然認爲你應該使用FMDB。它確實減輕了這些錯誤,讓你專注於代碼的真正問題。

+0

謝謝......我應該看到... – SpokaneDude 2011-04-26 20:48:20

+0

我討厭Objective-C!對於像我這樣的.NET程序員來說,這是毫無意義的!我試圖去了解它,但正如你所看到的,這對我來說是一場真正的鬥爭......感謝你的幫助,我真的很感激它。幾分鐘後我會再次請求幫助:D – SpokaneDude 2011-04-26 21:20:47