执行多个sqlite3_exec,不创建表,为什么?

时间:2014-03-22 21:48:39

标签: ios iphone objective-c database sqlite

我有这个代码,用4个表创建一个新数据库' fazerbem.sqli':

-(void)iniciarBancoDeDados{

    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docsDir = dirPaths[0];

    databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent:@"fazerbem.sqli"]];
    NSLog(@"DB Path: %@", databasePath);

    NSFileManager *filemgr = [NSFileManager defaultManager];

    if ([filemgr fileExistsAtPath: databasePath ] == NO) {
        const char *dbpath = [databasePath UTF8String];
        if (sqlite3_open(dbpath, &myDatabase) == SQLITE_OK) {
            char *errMsg;


            const char *sql_clientes =
            "CREATE TABLE IF NOT EXISTS fazerbem_clientes (ID INTEGER PRIMARY KEY AUTOINCREMENT, nome VARCHAR)";

            const char *sql_produtos = "CREATE TABLE IF NOT EXISTS fazerbem_produtos (ID INTEGER PRIMARY KEY AUTOINCREMENT, codigo VARCHAR)";


            const char *sql_fornecedores = "CREATE TABLE IF NOT EXISTS fazerbem_fornecedores (ID INTEGER PRIMARY KEY AUTOINCREMENT , telefone VARCHAR)";

            const char *sql_marcas = "CREATE TABLE IF NOT EXISTS fazerbem_marcas (ID INTEGER PRIMARY KEY AUTOINCREMENT, marca VARCHAR)";



            if (sqlite3_exec(myDatabase, sql_clientes, NULL, NULL, &errMsg) != SQLITE_OK && sqlite3_exec(myDatabase, sql_produtos, NULL, NULL, &errMsg) != SQLITE_OK && sqlite3_exec(myDatabase, sql_fornecedores, NULL, NULL, &errMsg) != SQLITE_OK && sqlite3_exec(myDatabase, sql_marcas, NULL, NULL, &errMsg) != SQLITE_OK) {

                NSLog(@"A cricao do banco de dados falhou");

            } else {

                NSLog(@"O banco foi criado com sucesso");

            }



            sqlite3_close(myDatabase);
        } else {

            NSLog(@"Abertura e cricao do banco falharam");

        }
    }

}

通过insert命令,我可以在fazerbem_clientes表中插入新值,但是当我尝试在表fazerbem_produto中插入值时,没有记录值,过了一会儿,我使用命令在插入上返回错误消息,并看到他声称fazerbem_produtos表不存在。

回到上面的代码,我该如何解决这个问题?这次成功创建了四个表吗?

1 个答案:

答案 0 :(得分:1)

if语句中的逻辑不正确。如果对sqlite3_exec的第一次调用返回SQLITE_OK(意味着它有效),则其他人将不会被调用,您最终会进入else语句。

以这种方式尝试:

if (sqlite3_exec(myDatabase, sql_clientes, NULL, NULL, &errMsg) == SQLITE_OK &&
    sqlite3_exec(myDatabase, sql_produtos, NULL, NULL, &errMsg) == SQLITE_OK && 
    sqlite3_exec(myDatabase, sql_fornecedores, NULL, NULL, &errMsg) == SQLITE_OK && 
    sqlite3_exec(myDatabase, sql_marcas, NULL, NULL, &errMsg) == SQLITE_OK) {
    NSLog(@"O banco foi criado com sucesso");
} else {
    NSLog(@"A cricao do banco de dados falho");
}

如果全部4成功,这将显示成功。