13

ANIMALという作業テーブルで実行されているアプリケーションがあります。このテーブルを最初に作成したときは、単に_id列とanimal_name列で構成されていました。

現在、animal_biography列を含めて拡張しようとしていますが、少し問題があります。最初は、CREATE_TABLEステートメントをアップグレードして動物の略歴を含める場合だと思いました。

private static final String DATABASE_CREATE =       
                        "create table " + ANIMALS_TABLE +
                        " (_id integer primary key autoincrement, " + 
                        "animal_name text not null, " +
                        "biography text not null);"; 

ただし、logcatを見ると、logcatに挿入しようとすると、列の経歴が存在しないことがわかります。

onUpgrade()今、私はコードを使用して含めることによってデータベースをアップグレードしようとしました

db.execSQL("ALTER TABLE" + DATABASE_NAME);
db.execSQL(DATABASE_CREATE);

しかし、これも問題を解決していません。誰かがこの問題を修正する方法について何か指針を持っていますか?

4

1 に答える 1

53

使用している場合はSQLiteOpenHelper、テーブルを簡単にアップグレードできます。onCreateメソッドを実装onUpgradeし、データベースの現在のバージョンをクラスコンストラクターで提供する必要があります。テーブルを更新するときは、データベースのバージョン番号をインクリメントするだけで、メソッドで新しいテーブル作成クエリを指定し、onCreateメソッドに配置ALTER TABLEしてonUpgrade以前のバージョンのテーブルを更新します。Androidはデータベースのバージョンの不一致を検出すると、onUpgradeメソッドを自動的に呼び出します。例を参照してください。

public class OpenHelper extends SQLiteOpenHelper {

    private final static int    DB_VERSION = 2;

    public TracksDB(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        final String CREATE_TBL =
            "create table " + ANIMALS_TABLE +
            " (_id integer primary key autoincrement, " + 
            "animal_name text not null, " +
            "biography text not null);";
             db.execSQL(CREATE_TBL);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion < 2) {
            final String ALTER_TBL = 
                "ALTER TABLE " + ANIMALS_TABLE +
                " ADD COLUMN biography text not null;";
            db.execSQL(ALTER_TBL);
        }
    }
}

このアップグレード方法は、特にアプリがすでに公開されている場合に、ユーザーデータを失うことなくテーブルを変更する正しい方法です。

于 2011-04-16T17:10:50.243 に答える