这是我第一次使用SQL,我认为我做的一切都正确,但我不断收到我的表不存在的错误。要创建表格,我做了:
CREATE TABLE "Users" ("UserID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "UserName" VARCHAR, "Password" VARCHAR)
所以我有一个名为Users
的表要写入表格,我称之为:
- (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"];
}
答案 0 :(得分:1)
我很确定您收到此错误,因为sqlite无法找到您的 sqlite 文件,因此它会创建一个空数据库。在一个空的数据库中,它显然不会找到你的表,因此错误。
因此,正确地到达数据库文件应该是您的重点。从您的代码中看来,您似乎是从文档目录中读取它 - 但如果您没有将它复制到该目录,那么您的db文件就无法实现。
尝试将实际的sqlite文件添加到您的包中。然后,使用此代码到达sqlite文件的路径:
databasePath = [[NSBundle mainBundle] pathForResource:@"UserDatabase" ofType:@"sqlite"];
我相信这可以解决你的问题。但是,您应该注意,如果要保存对该数据库的更改,并且我认为您希望这样做,则不会将该文件复制到文档目录,因为捆绑文件是只读的。在这种情况下,您将在目录路径中搜索sqlite文件,如果未找到(可能是首次使用应用程序) - 将其从捆绑包中复制到该目录。