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

标签 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");

        }
    }

}

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

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

最佳答案

您在 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 个都成功,这将显示成功。

关于ios - 执行多个sqlite3_exec,不创建表,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22584038/

相关文章:

iphone - 访问无法修改的父类扩展中定义的 Obj-C 属性

ios - 使用单例类来跟踪用户信息是否合适?

ios - 从其他设备收到 NSData 后,NSKeyedUnarchiver 不起作用

ios - Swift 如何使用带有平移手势的属性动画器

ios - 在 CocoaPods 和 SwiftPM 中实现的 FBLPromise 崩溃

iphone - 自定义代表

iOS:从任何地方返回 Root View Controller

objective-c - 使用 NSNotificationCenter 从另一个 View 更新 UILabel

ios - 在 iOS 应用程序中拥有动画背景

ios - 在我的函数中使用未声明的标识符