2012-03-24 11 views
0

私のiPhone AppデータベースにFMDBを使用しています。データベースとテーブルのスキーマを一度しか作成しません。iOS - データベーススキーマを作成する(実行コードは1回のみ)

ユーザーがアプリケーションをインストールまたは更新するときにOBJCコードを実行するにはどうすればよいですか?あなたが特定のブール値はユーザデフォルトに見つからない場合は実行されるいくつかのコードを持っているので(、唯一のユーザーはアプリを削除したときにリセットされるNSUserDefaults -

種類は

答えて

3

あなたがNSUserDefaultsでブール値を設定することができますよろしく実行後にその値を保存して、再度実行されないようにします)。

これは普通の「実行時コード一度のインストール」のシナリオをカバーします。同様のアプローチで更新する場合はCFBundleVersion変数を使用します(これはアプリのバージョンごとに異なります)。

1

まず、アップグレードの際に何かを実行することは考えられないかもしれません。なぜなら、これは不可能だからです。 @lxtのように、データベースバージョンを示すために値をプリファレンスに格納できますが、防弾ではない可能性があります。

この問題を解決する一般的なアプローチは、自己構築型メタデータを使用することです。最初にデータベースを作成したときは、"metadata"または"properties"という名前の追加のテーブルを作成し、2つのvarcharカラム"name"および"value"を追加する必要があります。 1行、("database_ver", "1")を挿入します。

データベースレイヤ(またはアダプタ)クラスでは、開くための「開く」メソッドを作成します。この方法では、まずselect database_ver from metadata;を実行してデータベースのバージョンを確認します。何も取得されない場合は、テーブル作成スクリプトを実行し、database_ver = 1行を挿入します。

その後、テーブル形式をアップグレードした場合、各バージョンにalter tableステートメントを入力し、database_verに基づいて実行します。アップグレード後のインストールでは、更新されたcreate tableステートメントを使用して、alter tableを経由せずに"database_ver""2"(以上)に直接設定することができます。

嗜好に値を格納するのと比べて、実際にはデータベース自体に格納する方が一般的です。ユーザーがファイルをどこかにバックアップしたり、バージョンをスキップしても、メタデータテーブルによってデータベースの形式を伝えることができます。

FMDBはこのようなメカニズムを実行しても問題ありません。

関連する問題