0

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

4

3 回答 3

1

架构.h

extern NSString * someSchema;

架构.m

NSString * someSchema = @"CREATE TABLE IF EXISTS blah...."
@"More SQL here"
@"more SQL here";
于 2012-05-29T03:10:36.587 回答
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];

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

于 2012-05-29T03:30:52.150 回答
0

我想出的一个有趣的解决方案是扩展属性。可以将 Run Script 阶段添加到 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);

这样,我可以将架构保存在单独的文件中,而无需将其修改为头文件。明显的缺点是扩展属性可能无法在某些文件操作中存活。

于 2012-05-29T07:25:22.843 回答