Як додати новий стовпець до бази даних SQLite Android?


83

У мене одна проблема з SQLiteбазою даних Android .

У мене є одна таблиця, яка містить одне поле. StudentFname, і ця програма працює нормально з Android 2.3.1, і тепер, якщо я додаю інше поле, моя програма працює неправильно.

Хто-небудь може мені допомогти, хто дуже добре знає базу даних,

Відповіді:


189

Ви можете використовувати ALTER TABLEфункцію для вашого onUpgrade()методу, наприклад:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // If you need to add a column
  if (newVersion > oldVersion) {
     db.execSQL("ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0");
  }
}

Очевидно, що SQLite буде відрізнятися залежно від визначення стовпця.


1
Привіт! я спробував це, я використовував метод оновлення, і всередині цього я також поставив запит alter table. але все одно я не можу додати новий стовпець до бази даних .. але я, коли пишу запит, щоб додати новий стовпець і перейменований база даних та ім'я таблиці, як я можу додати новий стовпець .. але за допомогою методу alter table я не можу це зробити ... перейменування бази даних і таблиці не є бажаним завданням .. вона повинна працювати з alter table.. все ще я не можу зробити це за допомогою методу alter table ..
Аамірхан

@NagarjunaReddy вибачте за пізню відповідь. ви можете використовувати цей метод db.execSQL ("ОНОВИТИ таблицю SET ключ = ключ + 1 WHERE ім'я =?", новий рядок [] {назва});
DevYudh

3
Не забудьте збільшити версію бази даних, інакше onUpgrade () не буде викликаний. Збільште номер версії в наведеному нижче коді, який буде присутній у конструкторі класу, який розширює клас SQLiteOpenHelper. super (контекст контексту, ім'я рядка, фабрика CursorFactory, int newVersion)
appdroid

Додаток зависає, і у мене є багато подібних повідомлень про журнал cat: Пул з'єднань для бази даних "+ дані + користувач + 0 + com ..._ db" не зміг надати з'єднання потоку 1 (основний) з прапорами 0x5 для. Чому це сталося?
Махді

if (newVersion > oldVersion) умова тут непотрібна, оскільки onUpgradeсама викликається лише тоді, коли ця умова виконується, тобто нова версія перевищує стару версію
новачок

31

Я натрапив на цю тему, коли потребував допомоги у власному додатку, але побачив проблеми з багатьма відповідями. Я б рекомендував зробити наступне:

private static final String DATABASE_ALTER_TEAM_1 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " string;";

private static final String DATABASE_ALTER_TEAM_2 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " string;";

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
         db.execSQL(DATABASE_ALTER_TEAM_1);
    }
    if (oldVersion < 3) {
         db.execSQL(DATABASE_ALTER_TEAM_2);
    }
}

Ви хочете переконатися, що код буде працювати, коли користувачі оновлять більше 1 версії, і що оператор оновлення виконує лише одне необхідне оновлення. Щоб дізнатись більше про це, перегляньте цей блог .


що робити, якщо ми хочемо створити змінений стовпець із значенням рядка за замовчуванням ??
shridutt kothari

22

Найпростіший спосіб зробити це - додати якийсь SQL to the onUpgrade()метод у свій SQLiteOpenHelper class. Щось на зразок:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    // If you need to add a new column
    if (newVersion > oldVersion) {
        db.execSQL("ALTER TABLE student ADD COLUMN student_rollno INTEGER DEFAULT 0");
    }
}

Я спробував це, але все ще не можу додати новий стовпець за допомогою методу alter table у методі оновлення.
Аамірхан

Привіт! я спробував це, я використовував метод оновлення, і всередині цього я також поставив запит alter table. але все одно я не можу додати новий стовпець до бази даних .. але я, коли пишу запит на додавання нового стовпця та перейменований база даних та ім'я таблиці, як я можу додати новий стовпець .. але за допомогою методу alter table я не можу це зробити ... перейменування бази даних і таблиці не є бажаним завданням .. вона повинна працювати з alter table.. все ще я не можу зробити це за допомогою методу alter table
Aamirkhan

@ user370305 чи потрібно додавати новий стовпець у tablle create statement для нових користувачів, які вперше встановлюють додаток?
Ahesanali Suthar

15

Можливо, трохи більш елегантний підхід із використанням перемикача замість if / then, який оновить будь-яку схему до останньої схеми ...

Ось також пристойна сторінка синтаксису для зміни таблиці: http://alvinalexander.com/android/sqlite-alter-table-syntax-examples

public static final String TABLE_TEAM = "team";
public static final String COLUMN_COACH = "coach";
public static final String COLUMN_STADIUM = "stadium";


private static final String DATABASE_ALTER_TEAM_TO_V2 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " TEXT;";

private static final String DATABASE_ALTER_TEAM_TO_V3 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " TEXT;";


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    switch (oldVersion)
    {
        case 1:
            //upgrade from version 1 to 2
            db.execSQL(DATABASE_ALTER_TEAM_TO_V2);
        case 2:
            //upgrade from version 2 to 3
            db.execSQL(DATABASE_ALTER_TEAM_TO_V3);

        //and so on.. do not add breaks so that switch will
        //start at oldVersion, and run straight through to the latest

    }

}

Це спосіб багаторазового оновлення. Перевірка, з якої версії походить!
Рікардо

Якщо ви перейдете від версії 1 до 3 безпосередньо (якщо хтось не буде автоматично оновлювати програму), ви не дійдете до справи 2.
TyMarc

@ TyMarc - Так, він оновиться до версій 2, а потім 3. Комутатор використовує стару версію. Отже, у вашому прикладі стара версія дорівнює 1. Код тоді запустить випадок 1, який оновиться з версій 1 до 2, а потім запустить випадок 2 (оскільки немає перерви;), який оновить з 2 до 3. Це все в описі.
Edward Bagby

4

Я застосував наступний підхід, він для мене розроблений

якщо версія БД: 6

Ex : There is a table with 5 columns

Під час оновлення до: 7 (я додаю 1 новий стовпець у 3 таблиці)

 1. We need to add the columns when creating a table

 2. onUpgrade method:

 if (oldVersion < 7) 
 { 
    db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID);
    db.execSQL(DATABASE_ALTER_LAST_UPLOADED);
    db.execSQL(DATABASE_ALTER_PAPER_LABEL); 
 }

Де: "DATABASE_ALTER_ADD_PAPER_PAID" - це запит.

EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE "
                + TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;";

Після двох вищеописаних операцій це буде добре працювати для свіжого користувача встановлення та користувача оновлення програми


3

@ Aamirkhan.i я думаю, що ти вже давно вирішив би проблему, про яку ти згадував у коментарях. Я думаю, ти не збільшив версію бази даних. або відповіді тут прямо вперед. я пишу це, тому що це може допомогти кожному, хто не збільшував або не змінював номер версії бази даних, коли вони змінюють таблицю.


так, зміна назви бази даних та видалення програми та її повторна інсталяція вирішили б проблему
Аамірхан,

@Aamirkhan, перейдіть, будь ласка, до наступної відповіді, щоб більш чітке рішення було доступним для громадськості.
AlleyOOP

3

Я думаю, нам не слід перевіряти такий стан

 if (newVersion > oldVersion) {
 }

тому що якщо ми використовуємо це, це означає, що кожного разу, коли ми збільшуємо версію бази даних, тоді викличе onUpdrade (), і умова буде істинною, тому ми повинні перевірити так

if(oldVersion==1) 
{

}

так що в цьому випадку, якщо стара версія 2, то умова буде помилковим, а користувач зі старою версією 2 не буде оновлювати базу даних (яку користувач бажає лише для версії 1), оскільки для цих користувачів база даних вже оновлена.


1

Щоб додати новий стовпець до таблиці, потрібно скористатися ALTER. В android ви можете додати новий стовпець всередині onUpgrade().

Ви можете задатися питанням, як onUpgrade()додати новий стовпець?

При реалізації підкласу SQLiteOpenHelper, вам потрібно викликати конструктор суперкласу: super(context, DB_NAME, null, 1);у конструкторі вашого класу. Там я перейшов 1на версію.

Коли я змінив версію 1на вище ( 2або вище), onUpgrade()буде викликано. І виконати модифікації SQL, які я маю намір зробити. Мій конструктор класів після зміни версії:

public DatabaseHelper(Context context) {
    super(context, DB_NAME, null, 2);//version changed from 1 to 2
}

Модифікації SQL перевіряють таким чином, конструктор суперкласу порівнює версію збереженого файлу баз даних SQLite з версією, якій я передав super(). Якщо ці (попередні та теперішні) номери версій різні, onUpgrade()отримується виклик.

Код повинен виглядати так:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // add new columns to migrate to version 2
    if (oldVersion < 2) { 
        db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN school VARCHAR(250)");
    }
    // add new columns to migrate to version 3
    if (oldVersion < 3) { 
        db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN age INTEGER");
    }
}

1

Просто змініть свій код

приватний кінцевий int DATABASE_VERSION = 1;

до

приватний статичний фінал int DATABASE_VERSION = 2;


0

Я натрапив на посилання під час пошуку тієї самої проблеми. Тут пояснюється, як використовувати оновлення. https://thebhwgroup.com/blog/how-android-sqlite-onupgrade

це пояснює, чому використовувати цей код нижче

 @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion < 2) {
             db.execSQL(DATABASE_ALTER_TEAM_1);
        }
        if (oldVersion < 3) {
             db.execSQL(DATABASE_ALTER_TEAM_2);
        }
    }

0

Найпростіший спосіб створити новий стовпець у таблиці - це додати SQL до методу onUpgrade () у класі SQLiteOpenHelper. Подібно до:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    switch (oldVersion) {
        case 1:
            db.execSQL(SQL_MY_TABLE);

        case 2:
            db.execSQL("ALTER TABLE myTable ADD COLUMN myNewColumn TEXT");
    }
}

0

спочатку збільште номер версії бази даних. а потім у onUpgradeметоді ви можете перевірити, чи вже існує стовпець, якщо ні, тоді лише додайте стовпець

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   if(!existsColumnInTable(db, TABLE_NAME, COLUMN_NAME)){
      db.execSQL("ALTER TABLE foo ADD COLUMN COLUMN_NAME INTEGER DEFAULT 0");
 } 
 }

private boolean existsColumnInTable(SQLiteDatabase inDatabase, String inTable, String columnToCheck) {
    Cursor cursor = null;
    try {
        // Query 1 row
        cursor = inDatabase.rawQuery("SELECT * FROM " + inTable + " LIMIT 0", null);

        // getColumnIndex() gives us the index (0 to ...) of the column - otherwise we get a -1
        if (cursor.getColumnIndex(columnToCheck) != -1)
            return true;
        else
            return false;

    } catch (Exception Exp) {
        return false;
    } finally {
        if (cursor != null) cursor.close();
    }
}

цей метод витягується з цього посилання Перевірка, чи існує стовпець у базі даних програми на Android

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.