在iOS中使用多个表创建SQLite DB

时间:2014-06-03 13:32:43

标签: ios sqlite

在我开发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); 

但不记录任何想法

1 个答案:

答案 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释放该消息。