1

次のように、クラスを使用してSQLiteOpenHelperを拡張しています。

public class PocketSQLite extends SQLiteOpenHelper {
    public String TableNames[];
    public String FieldNames[][];
    public String FieldTypes[][];
    public static String NO_CREATE_TABLES = "no tables";
    private String message = "";

    public PocketSQLite(Context context, String name, CursorFactory factory, int version, String tableNames[], String fieldNames[][], String fieldTypes[][]) {
        super(context, name, factory, version);
        TableNames = tableNames;
        FieldNames = fieldNames;
        FieldTypes = fieldTypes;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        if (TableNames == null) {
            message = NO_CREATE_TABLES;
            return;
        }

        for (int i = 0; i < TableNames.length; i++) {
            String sql = "CREATE TABLE " + TableNames[i] + "(";
            for (int j = 0; j < FieldNames[i].length; j++)
                sql += FieldNames[i][j] + " " + FieldTypes[i][j] + ",";
            sql = sql.substring(0, sql.length() - 1);
            sql += ")";
            db.execSQL(sql);
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        for (int i = 0; i < TableNames[i].length(); i++) {
            String sql = "DROP TABLE IF EXISTS " + TableNames[i];
            db.execSQL(sql);
        }
        onCreate(db);
    }
}

ご覧のとおり、コンストラクターはテーブルのフィールドに入ります。onUpgrade関数を更新して、既存のテーブルに新しいフィールドを追加するにはどうすればよいですか?

例えば:

古いテーブル(2フィールド): "名前"、"電話"

新しいテーブル(3フィールド):「名前」、「電話」、「メール」

4

1 に答える 1

0

まず、このような構造上の変更を行う場合は、データベースのバージョンを変更する必要があります。次に、upgradeメソッドで、テーブルを変更するsqlステートメントを記述します。

次回アプリを実行すると、onUpgradeメソッドが呼び出され、SQLステートメントが実行されてテーブルが変更されます。

http://www.w3schools.com/sql/sql_alter.asp

テーブルを削除することもできますが、あなたが言ったように、既存のデータは失われます。

于 2012-07-19T15:19:49.337 に答える