web-dev-qa-db-ja.com

Android SQLite Database?に新しい列を追加するには?

Android SQLiteデータベースに関する問題が1つあります。

1つのfield.StudentFnameを含むテーブルが1つあり、そのアプリケーションはAndroid 2.3.1で正常に動作しています。別のフィールドを追加すると、アプリケーションが正常に動作しなくなります。

データベースをよく知っている人は誰でも助けてもらえますか、

75
Aamirkhan

次のように、onUpgrade()メソッドでALTER TABLE関数を使用できます。

@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は列の定義によって異なります。

176
DevYudh

自分のアプリでヘルプが必要なときにこのスレッドに出くわしましたが、多くの答えに問題がありました。次のことをお勧めします。

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);
    }
}

ユーザーが複数のバージョンをアップグレードするときにコードが機能すること、およびupdateステートメントが必要な1つのアップグレードのみを実行することを確認する必要があります。これについてもう少し詳しくは、こちらをご覧ください blog

23
PFranchise

これを行う最も簡単な方法は、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");
    }
}
_
22
user370305

おそらく、if/thenの代わりにswitchを使用するわずかにエレガントなアプローチで、任意のスキーマから最新のスキーマにアップグレードします...

また、テーブルを変更するための構文に関する適切なページもあります。 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

    }

}
13
Edward Bagby

私たちはそのような状態をチェックするべきではないと思います

 if (newVersion > oldVersion) {
 }

これを使用すると、データベースのバージョンを上げるたびにonUpdrade()が呼び出され、条件がtrueになるため、そのようにチェックする必要があるためです。

if(oldVersion==1) 
{

}

したがって、この場合、古いバージョンが2の場合、条件はfalseになり、古いバージョン2のユーザーはデータベースを更新しません(ユーザーはバージョン1のみを必要とします)。

3
Himanshu arora

@ Aamirkhan.iは、あなたがずっと前にコメントで言及した問題を解決したと思う。データベースバージョンを上げなかったと思う。または、ここでの答えは簡単です。テーブルを変更するときにデータベースのバージョン番号を増やしたり変更したりしていない人を助けることができるので、私はこれを書いています。

3
dora

私は次のアプローチをしました、それは私のために解決されます

DBバージョンが6の場合

Ex : There is a table with 5 columns

7にアップグレードするとき(3つのテーブルに1つの新しい列を追加しています)

 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;";

上記の2つの操作の後、新規インストールユーザーとアプリアップグレードユーザーに対して正常に動作します。

2
sssvrock

テーブルに新しい列を追加するには、ALTERを使用する必要があります。 Androidでは、onUpgrade()内に新しい列を追加できます。

onUpgrade()が新しい列をどのように追加するのか疑問に思うかもしれません。

SQLiteOpenHelperのサブクラスを実装するときは、クラスコンストラクターでスーパークラスコンストラクターsuper(context, DB_NAME, null, 1);を呼び出す必要があります。そこで、バージョンに_1_を渡しました。

バージョン_1_をabove(_2_以上)に変更すると、onUpgrade()が呼び出されます。そして、私がやろうとしているSQLの変更を実行します。バージョンを変更した後のクラスコンストラクター:

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

SQLの変更はこのようにチェックし、スーパークラスコンストラクターは、保存されているSQLite dbファイルのバージョンと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
Blasanka

テーブルに新しい列を作成する最も簡単な方法は、SQLiteOpenHelperクラスのonUpgrade()メソッドにSQLを追加することです。好む:

@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
Digvij Borda

同じ問題を検索中にリンクを見つけました。アップグレードの使用方法について説明します。 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
Anand

コードを変更するだけです

private final int DATABASE_VERSION = 1;

private static final int DATABASE_VERSION = 2;

0
Shahzad Ahmad