2011-06-29 7 views
4

以下のシナリオを考えてください。SQLite3に関する質問とiPhoneアプリケーションの更新

私は16列のSQLite3テーブルでクエリを実行するiPhoneアプリケーションをアプリストアに持っています。更新として、この表に新しい列を追加したいとします。

誰かがアップデートをインストールすると、それはうんざりしますか?テーブルは交換されますか?これはどのように作動しますか。私はこれをどのように扱うべきですか?

+0

sqlite 3では列の追加がサポートされていないため、古い表の名前を変更し、新しい表を含めて新しい表を作成し、古い表から新しい表を移入してから最後に削除する必要があります古いテーブル。 –

+0

あなたは100%確実ではありませんか?私はかなり確信しているので... – CodeGuy

+0

それは間違いなく動作します...私は私のアプリケーションでは、列なしでデータベースをインストールしました。それは列を追加しました。 2回目に追加していないので、間違いなく動作します。 – CodeGuy

答えて

4

実行する方法の1つは、起動時にテーブルに新しいフィールドがあるかどうかを確認することです。あなたが探しているフィールドは、結果セットに含まれていない場合、あなたはあなたのテーブルを更新するためにALTER TABLE table-name ADD COLUMN column-name column-typeを実行し、

PRAGMA table_info(table-name); 

テーブルからすべてのフィールドを取得するには、次のSQLiteのコマンドを使用することができます。

あなたは

- (BOOL)getFields 
{ 
    const char *sql = "PRAGMA table_info(myTable)"; 
    sqlite3_stmt *stmt; 

    if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) != SQLITE_OK) 
    { 
     return NO; 
    } 

    while(sqlite3_step(stmt) == SQLITE_ROW) 
    { 
     NSString *fieldName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)]; 
     NSLog(@"%@", fieldName); 
    } 

    return YES; 
} 

テーブルのフィールドをループし、この方法を使用することを願って、これは

+0

「テーブルからすべてのフィールドを取得する」ために、より多くのコードを提供できますか? – CodeGuy

+0

"Apple"という名前の列があるかどうか確認したい。 – CodeGuy

+0

確かにうまくいくと思う。 – CodeGuy

1

を助け、あなたがそれを編集可能にするデータベースをコピーしたことがない場合はFYI、それが置き換えられます。あなたが書き込み可能などこかにDBをコピーした場合は、自分自身の置き換えを処理する必要があります。

+0

どういう意味ですか?私は最初にアプリケーションを作ったとき、私のフレームワークフォルダにデータベースをドラッグしました。アップデートで置き換えられますか? – CodeGuy

+0

それはまさにDavid Hodgeがちょうど答えたものです。コピーしていないので、置き換えられます。 –

+1

あなたがそれを提出したときにアプリに単純に含まれているものはすべて、アップデートに置き換えられます。 iOSでは、あなたのアプリケーションバンドルは読み取り専用であり、最新のアップデートでアップルに提出したものを正確に含んでいます。あなたのために、そこには最新のDBが焼き付けられます。 –

関連する問題