如何在我的iOS项目中添加和执行.sql文件?

时间:2012-07-31 23:41:43

标签: ios database xcode sqlite

我发现很多关于在iOS中使用SQLite数据库的教程,但没有发现任何直接引用.sql文件的内容。有人能告诉我如何将现有的SQL数据库链接到我的应用程序吗?

编辑:这是一个MySQL转储。我们有一个基于浏览器的闪存卡程序,我们现在正在复制Android和iOS设备。该文件已有语句来创建表并填充数据,但我不知道如何在应用程序中使用该数据。我是否想要使用NSSearchPathForDirectoriesInDomains?

1 个答案:

答案 0 :(得分:3)

我将脚本作为iOS项目的一部分执行。我这样做的原因是创建数据库模式的同一系列脚本也会更新数据库模式(在发布之后,运行新的delta脚本以向前拉取模式)。这里详细解释:

SQLITE with Android (best methodology for setting up a database)

我将脚本添加为项目中的资源,然后执行它。有一些EXxxx日志记录调用,但通用。注意使用tail-sqlite在脚本循环时执行一个语句,尾部作为它停止的标记。这是我用来执行的功能:

- (BOOL)executeScript:(NSString *)contents error:(NSError **)error
{
    ENHeading(@"executeScript");

    sqlite3_stmt *stmt = NULL;
    const char *zTail;
    int rc;

    zTail = [contents UTF8String];

    while(zTail != NULL && 0 < strlen(zTail)) 
    {
        ENDebug("zTail: \"%s\"\n", zTail);

        NSString *tailStr = [NSString stringWithUTF8String:zTail];
        NSString *trimmed = [tailStr stringByTrimmingCharactersInSet:
                             [NSCharacterSet whitespaceAndNewlineCharacterSet]];

        if ([trimmed length] == 0)
        {
            ENInfo("ignoring trailing whitespace");
            break;
        }

        // Temporarily hold this until the end of the loop in case we need to report an error
        const char *newzTail;

        rc = sqlite3_prepare_v2(_sqlite3, zTail, -1, &stmt, &newzTail);
        if(SQLITE_OK != rc) 
        {
            ENError(@"prepare err:%@", [self errorMessage]);
            if (error != NULL) {
                *error = [[[ENSqliteError alloc] initWithErrorCode:ENSqliteErrorInvalidSql 
                                                            reason:[self errorMessage]] autorelease];
            }

            return NO;
        }

        rc = sqlite3_step(stmt);
        ENDebug(@"rc=%d", rc);
        switch (rc)
        {
            case SQLITE_ROW:
                ENError(@"statement returns rows, script ignores");
                break;

            case SQLITE_OK:
            case SQLITE_DONE:
                break;

            default:
                ENError(@"error");
                ENError(@"prepare err:%@", [self errorMessage]);
                if (error != NULL) {
                    *error = [[[ENSqliteError alloc] initWithErrorCode:ENSqliteErrorReadingRows 
                                                                reason:[self errorMessage]] autorelease];
                }

                return NO;
        }

        // For next time around the loop
        zTail = newzTail;

        // Clear up since we're about to prepare another
        sqlite3_finalize(stmt);
    } 

    return YES;
}