sqlite3创建表问题

时间:2014-12-10 15:31:56

标签: objective-c iphone sqlite

我有一个我正在开发的应用程序,它将存储足球比赛统计信息,但我的sqlite数据库出现问题。我的保存方法是:

-(void) saveData{
    NSString *databasePath;
    sqlite3_stmt *statement;
    const char *dbpath =[databasePath UTF8String];


    char *errMsg;


    NSString *games;
    games= @"games";
    NSString *entree =[NSString stringWithFormat:@"create table if not exists %@(id integer, home text, away text)", games];
    if (sqlite3_open(dbpath, &_gameFile)==SQLITE_OK){
        if(sqlite3_exec(_gameFile, [entree UTF8String], NULL, NULL, &errMsg) !=SQLITE_OK){
        NSLog(@"executing %s", sqlite3_errmsg(_gameFile));
        } else {
            NSLog(@"table created (%@)", entree);
        }
}
    sqlite3_close(_gameFile);
    if (sqlite3_open(dbpath, &_gameFile)==SQLITE_OK){

        NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO games (id, home, away) VALUES (\"%@\",\"%@\",\"%@\")", dataPoints[0], dataPoints[1], dataPoints[2]];
        const char *insert_stmt = [insertSQL UTF8String];
        sqlite3_prepare_v2(_gameFile, insert_stmt, -1, &statement, NULL);
        int rc =sqlite3_step(statement);
        if(sqlite3_step(statement) == SQLITE_DONE){
            NSLog(@"success");
            NSLog(@"tried to enter %@" , insertSQL);
        } else if(sqlite3_step(statement) == SQLITE_MISUSE){
            NSLog(@"%@", insertSQL);
            NSLog(@"Error %s while preparing statement", sqlite3_errmsg(_gameFile));
        }
        sqlite3_finalize(statement);
        sqlite3_close(_gameFile);
    }
}

这会在日志中生成以下条目:

2014-12-10 15:25:32.752 Footy Predictor[1718:513765] table created (create table if not exists games(id integer, home text, away text))
2014-12-10 15:25:32.759 Footy Predictor[1718:513765] INSERT INTO games (id, home, away) VALUES ("1446","Den Haag","Excelsior")
2014-12-10 15:25:32.760 Footy Predictor[1718:513765] Error no such table: games while preparing statement

我不确定我在哪里出错了,因为日志表创建了表格,然后说没有这样的表格。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我没有明确的答案,因为sqlite可能会出现很多问题。

我能看到的主要是你没有初始化databasePath。这需要是.db文件的路径,例如〜/桌面/ myDatabase.db。

1)我假设你只想处理statement一次,而你实际上是插入它3次。您需要检查rc的值,即只调用sqlite3_step一次,然后将rc放入if语句中:

int rc =sqlite3_step(statement);
        if(rc == SQLITE_DONE){
            NSLog(@"success");
            NSLog(@"tried to enter %@" , insertSQL);
        } else {
            NSLog(@"%@", insertSQL);
            NSLog(@"Error %s while preparing statement", sqlite3_errmsg(_gameFile));
        }

2)检查sqlite3_prepare_v2的返回值是否成功。

3)您需要规范化您的陈述(documentation for sqlite3_bind),否则当您的用户输入通配符时会遇到问题,例如: “?”或者像“DROP”这样的陈述

4)您是否考虑过使用核心数据?它太容易了(虽然不是每个人的需要都不理想)。