我有一个我正在开发的应用程序,它将存储足球比赛统计信息,但我的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
我不确定我在哪里出错了,因为日志表创建了表格,然后说没有这样的表格。
非常感谢任何帮助。
答案 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)您是否考虑过使用核心数据?它太容易了(虽然不是每个人的需要都不理想)。