4

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

编辑:这是一个 MySQL 转储。我们有一个基于浏览器的抽认卡程序,我们现在正在为 Android 和 iOS 设备复制它。该文件已经包含创建表和填充数据的语句,但我不知道如何在应用程序中使用该数据。我可能想使用 NSSearchPathForDirectoriesInDomains 吗?

4

1 回答 1

3

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

SQLITE with Android(建立数据库的最佳方法)

我将脚本作为资源添加到项目中,然后执行它。有一些 EXxxx 记录调用,但在其他方面是通用的。注意tail的使用——sqlite在脚本循环时执行一条语句,tail作为它停止的标记。这是我用来执行的功能:

- (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;
}
于 2012-07-31T23:58:11.440 回答