如何在Objective-C命令行应用程序中嵌入SQL架构?

时间:2012-05-28 14:58:29

标签: objective-c

我有一个SQL架构,我需要在Objective-C命令行应用程序中提供给SQLite。我希望架构成为二进制文件的一部分,这样我就可以只分发一个文件。与常规Mac或iOS应用程序不同,二进制文件没有资源包,因此在应用程序包中存储资源的传统方式已经完成。是否有一种优雅的方式在源代码中包含架构?我知道我可以简单地将它作为多行字符串存储在标题中,但这很糟糕。

3 个答案:

答案 0 :(得分:1)

Schema.h

extern NSString * someSchema;

Schema.m

NSString * someSchema = @"CREATE TABLE IF EXISTS blah...."
@"More SQL here"
@"more SQL here";

答案 1 :(得分:0)

如何创建一个sql语句数组,然后使用枚举来访问语句。

Schema.h文件:

static const NSString *sqlStatements[] = {
    @"CREATE TABLE...",
    @"SELECT * FROM ...",
    ... // Lots of other statements
    @"DELETE ..."
};

typedef enum {
    SQLCREATECommand=0,
    SQLSelectCommand,
    ... // Matching enums
    SQLDeleteCommand
} SQLCommands;

用于其他文件:

NSString *stmt = sqlStatements[SQLCREATECommand];

这样做的好处是代码变得更易于维护。

答案 2 :(得分:0)

我提出的一个有趣的解决方案是扩展属性。可以将运行脚本阶段添加到Xcode构建过程中,该过程执行以下操作:

xattr -w com.company.Schema "`cat SQL/schema.sql`" \
    ${BUILT_PRODUCTS_DIR}/${EXECUTABLE_NAME}

然后在运行时:

const size_t maxSchemaSize = 1000;
char schema[maxSchemaSize] = {0};
getxattr(argv[0], "com.company.Schema", schema, maxSchemaSize, 0, 0);
NSLog(@"%s", schema);

这样我可以将模式保存在单独的文件中,而不会将其伪装成头文件。明显的缺点是扩展属性可能无法在某些文件操作中存活。