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