Подтвердить что ты не робот

Сложность при обновлении таблицы SQlite

У меня есть приложение, работающее с рабочей таблицей 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);"; 

однако, глядя на логарифм, он говорит мне, что биография колонки не существует при попытке вставить в нее.

Теперь я попытался обновить базу данных с помощью onUpgrade() и включая код

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

но это также не решает проблему. Есть ли у кого-нибудь указания относительно того, как решить эту проблему?

4b9b3361

Ответ 1

Если вы используете 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);
        }
    }
}

Этот способ обновления - это правильный способ изменения таблиц без потери пользовательских данных, особенно если приложение уже было выпущено для публики.