我有一个SQL架构,我需要在Objective-C命令行应用程序中提供给SQLite。我希望架构成为二进制文件的一部分,这样我就可以只分发一个文件。与常规Mac或iOS应用程序不同,二进制文件没有资源包,因此在应用程序包中存储资源的传统方式已经完成。是否有一种优雅的方式在源代码中包含架构?我知道我可以简单地将它作为多行字符串存储在标题中,但这很糟糕。
答案 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);
这样我可以将模式保存在单独的文件中,而不会将其伪装成头文件。明显的缺点是扩展属性可能无法在某些文件操作中存活。