2011-05-10 246 views
0

這是我第一次使用SQL,我以爲我做的都對,但我一直收到我的表不存在的錯誤。要創建我做表:寫入SQLite數據庫時出錯

CREATE TABLE "Users" ("UserID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "UserName" VARCHAR, "Password" VARCHAR) 

所以我有一個表命名爲用戶

要寫入表我打電話這樣的:

- (void) addUser { 

if(addStmt == nil) { 
    const char *sql = "insert into Users(UserName, Password) values (?, ?)"; 
    if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK) 
     NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database)); 
} 

sqlite3_bind_text(addStmt, 1, [userName UTF8String], -1, SQLITE_TRANSIENT); 
sqlite3_bind_text(addStmt, 2, [password UTF8String], -1, SQLITE_TRANSIENT); 

if(SQLITE_DONE != sqlite3_step(addStmt)) 
    NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
else 
    //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid 
    userID = sqlite3_last_insert_rowid(database); 

//Reset the add statement. 
sqlite3_reset(addStmt); 
} 

當我觸發此,它關閉該應用程序,並給我的錯誤 Error while creating add statement. 'no such table: Users'

花了我的時間去了這麼遠,我不知道從哪裏拿它從這裏。我能做些什麼來解決這個問題?

編輯: 這是我如何導入我的數據庫在我的AppDelegate文件

- (NSString *) getDBPath { 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
NSString *documentsDir = [paths objectAtIndex:0]; 
return [documentsDir stringByAppendingPathComponent:@"UserDatabase.sqlite"]; 
} 

回答

1

我敢肯定,因爲源碼找不到你源碼文件,你得到這個錯誤,因此它創建一個空的數據庫。而在一個空的數據庫中,它顯然不會找到你的表,因此錯誤。

因此,正確地到達數據庫文件應該是您的重點。從你的代碼看來,你可以從文檔目錄中讀取它 - 但是如果你沒有將它複製到該目錄中,那麼你的數據庫文件將無法到達那裏。

嘗試添加實際的sqlite文件到你的包。然後,使用此代碼,以達到您的SQLite文件的路徑:

databasePath = [[NSBundle mainBundle] pathForResource:@"UserDatabase" ofType:@"sqlite"]; 

,我相信這會解決您的問題。但是你應該注意到,如果你想保存對該數據庫的更改,並且我認爲你想要,你不會將該文件複製到文檔目錄,因爲捆綁文件是隻讀的。在這種情況下,您將搜索目錄路徑中的sqlite文件,如果未找到(可能是首次使用應用程序),請將其複製到該目錄中。

+0

聽起來像這樣會工作。打開其他文件時,我幾次遇到這個問題。如果我把SQL文件放在服務器上,我會以同樣的方式執行嗎?或者我將不得不涉及FTP? – Chris 2011-05-10 22:02:22