2011-05-10 254 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