在我开发ipad应用程序时,我需要一个包含5个表的数据库,但是,我不知道为什么在我的代码中,只执行1个语句而不返回任何错误:
const char *sqlStatement = "CREATE TABLE IF NOT EXISTS CATEGORIAS (ID INTEGER PRIMARY KEY, NOMBRE TEXT)";
char *error;
if(sqlite3_exec(dieneDB, sqlStatement, NULL, NULL, &error) == SQLITE_OK){
**sqlStatement = "CREATE TABLE IF NOT EXIST SUBCATEGORIAS (ID INTEGER PRIMARY KEY, ID_CATEGORIA INTEGER, NOMBRE TEXT)";**
if(sqlite3_exec(dieneDB, sqlStatement, NULL, NULL, &error) == SQLITE_OK){
sqlStatement = "CREATE TABLE IF NOT EXIST FORMATOS (ID INTEGER PRIMARY KEY, NOMBRE TEXT)";
if(sqlite3_exec(dieneDB, sqlStatement, NULL, NULL, &error) == SQLITE_OK){
sqlStatement = "CREATE TABLE IF NOT EXIST BEBIDAS (ID INTEGER PRIMARY KEY, ID_CATEGORIA INTEGER, ID_SUBCATEGORIA INTEGER, NOMBRE TEXT, DESCRIPCION TEXT, RUTA_IMAGEN TEXT)";
if(sqlite3_exec(dieneDB, sqlStatement, NULL, NULL, &error) == SQLITE_OK){
sqlStatement = "CREATE TABLE IF NOT EXIST BEBIDASFORMATOS (ID INTEGER PRIMARY KEY, ID_BEBIDA INTEGER, ID_FORMATO INTEGER)";
if(sqlite3_exec(dieneDB, sqlStatement, NULL, NULL, &error) == SQLITE_OK){
NSLog(@"All tables are created");
sqlite3_close(dieneDB);
[self loadData];
}
}
}
}
}else{
NSLog(@"Unable to create some table %s", error);
}
}else{
NSLog(@"Database Exists Already");
[self clearData]
}
}else{
NSLog(@"Error opening database");
}
}
它在第二个sqlStatement中崩溃并转到} else {
NSLog(@"Unable to create some table %s", error);
但不记录任何想法
答案 0 :(得分:3)
SQL中的问题似乎是您的第一个SQL语句正确使用IF NOT EXISTS
,但其余的使用IF NOT EXIST
。
您可能没有看到错误消息,因为如果第一个sqlite3_exec
失败,您只会记录错误。 if
语句的其余部分没有else
个子句。对于每次失败的NSLog
来电,您可能希望error
sqlite3_exec
。
或者,sqlite3_exec
与其他SQLite函数不同,它接受多个以分号结尾的SQL语句。因此大大简化了代码,因为只有一个sqlite3_exec
,您只需要一个else
语句:
const char *sqlStatement = "CREATE TABLE IF NOT EXISTS CATEGORIAS (ID INTEGER PRIMARY KEY, NOMBRE TEXT);"
"CREATE TABLE IF NOT EXISTS SUBCATEGORIAS (ID INTEGER PRIMARY KEY, ID_CATEGORIA INTEGER, NOMBRE TEXT);"
"CREATE TABLE IF NOT EXISTS FORMATOS (ID INTEGER PRIMARY KEY, NOMBRE TEXT);"
"CREATE TABLE IF NOT EXISTS BEBIDAS (ID INTEGER PRIMARY KEY, ID_CATEGORIA INTEGER, ID_SUBCATEGORIA INTEGER, NOMBRE TEXT, DESCRIPCION TEXT, RUTA_IMAGEN TEXT);"
"CREATE TABLE IF NOT EXISTS BEBIDASFORMATOS (ID INTEGER PRIMARY KEY, ID_BEBIDA INTEGER, ID_FORMATO INTEGER);";
char *error;
if(sqlite3_exec(dieneDB, sqlStatement, NULL, NULL, &error) == SQLITE_OK){
NSLog(@"All tables are created");
[self loadData];
} else {
NSLog(@"Unable to create some table %s", error);
sqlite3_free(error);
error = NULL;
}
注意,我已修复上面的IF NOT EXISTS
错误。另请注意,如果您收到错误消息,则您有责任使用sqlite3_free
释放该消息。