0

Objective-C コマンドライン アプリで SQLite にフィードする必要がある SQL スキーマがあります。1 つのファイルだけを配布できるように、スキーマをバイナリの一部にしたいと考えています。通常の Mac や iOS アプリとは異なり、バイナリにはリソース バンドルがないため、アプリ バンドル内にリソースを格納する従来の方法は使用できません。ソースにスキーマを含めるエレガントな方法はありますか? ヘッダーに複数行の文字列として単純に保存できることは知っていますが、それは最悪です。

4

3 に答える 3

1

Schema.h

extern NSString * someSchema;

Schema.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

私が思いついた興味深い解決策の 1 つは、拡張属性です。次のような実行スクリプト フェーズを 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 に答える