写入SQLite DB时出错

时间:2011-05-10 21:01:35

标签: iphone sql objective-c ios sqlite

这是我第一次使用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"];
}

1 个答案:

答案 0 :(得分:1)

我很确定您收到此错误,因为sqlite无法找到您的 sqlite 文件,因此它会创建一个空数据库。在一个空的数据库中,它显然不会找到你的表,因此错误。

因此,正确地到达数据库文件应该是您的重点。从您的代码中看来,您似乎是从文档目录中读取它 - 但如果您没有将它复制到该目录,那么您的db文件就无法实现。

尝试将实际的sqlite文件添加到您的包中。然后,使用此代码到达sqlite文件的路径:

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

我相信这可以解决你的问题。但是,您应该注意,如果要保存对该数据库的更改,并且我认为您希望这样做,则不会将该文件复制到文档目录,因为捆绑文件是只读的。在这种情况下,您将在目录路径中搜索sqlite文件,如果未找到(可能是首次使用应用程序) - 将其从捆绑包中复制到该目录。