Android SQLite 데이터베이스에 새 열을 추가하는 방법은 무엇입니까?


82

Android SQLite데이터베이스에 한 가지 문제가 있습니다.

하나의 field.StudentFname을 포함하는 하나의 테이블이 있으며 해당 응용 프로그램은 Android 2.3.1에서 제대로 작동하며 이제 다른 필드를 추가하면 응용 프로그램이 제대로 작동하지 않습니다.

데이터베이스를 잘 아는 사람이 나를 도울 수 있습니까?

답변:


188

다음 과 같이 메서드에서 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
안녕하세요! 나는 이것을 upgrate 메소드에 사용했고 내부 테이블 쿼리도 변경했지만 데이터베이스에 새 열을 추가 할 수는 없지만 새 열을 추가하는 쿼리를 작성하고 이름을 바꿀 때 새 열을 추가 할 수있는 것보다 데이터베이스와 테이블 이름이 둘 다 .. 그러나 alter table 메서드의 도움으로 나는 그렇게 할 수 없습니다 .. 데이터베이스와 테이블 이름을 바꾸는 것은 원하는 작업이 아닙니다 .. 그것은 alter와 함께 작동해야합니다 내가 테이블 변경 방법으로 그것을 할 수 아니다 table..still ..
아미르 칸

@NagarjunaReddy 늦게 회신 해 주셔서 죄송합니다. 이 메소드를 사용할 수 있습니다. db.execSQL ( "UPDATE table SET key = key + 1 WHERE name =?", new String [] {name});
DevYudh

3
데이터베이스 버전을 높이는 것을 잊지 마십시오. 그렇지 않으면 onUpgrade ()가 호출되지 않습니다. SQLiteOpenHelper 클래스를 확장하는 클래스의 생성자에있는 아래 코드에서 버전 번호를 늘립니다. super (컨텍스트 컨텍스트, 문자열 이름, CursorFactory 팩토리, int newVersion)
appdroid

앱이 멈추고 로그 고양이에 다음과 같은 많은 메시지가 있습니다. '+ data + user + 0 + com ..._ db'데이터베이스의 연결 풀이 0x5 플래그를 사용하여 스레드 1 (기본)에 연결을 부여 할 수 없습니다. 왜 이런 일이 발생 했습니까?
Mahdi

29

내 앱에 대한 도움이 필요할 때이 스레드를 보았지만 많은 답변에서 문제를 보았습니다. 다음을 수행하는 것이 좋습니다.

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

사용자가 둘 이상의 버전을 업그레이드 할 때 코드가 작동하고 업데이트 문이 필요한 업그레이드 만 실행하는지 확인하려고합니다. 이에 대한 자세한 내용은이 블로그를 확인하십시오 .


기본 문자열 값으로 변경된 열을 만들려면 어떻게해야합니까 ??
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");
    }
}

나는 이것을 시도했지만 여전히 upgrate 메소드에서 alter table 메소드를 사용하여 새 열을 추가 할 수 없습니다.
Aamirkhan 2011-12-05

안녕하세요! 나는 이것을 upgrate 메소드에 사용했고 내부 테이블 쿼리도 변경했지만 데이터베이스에 새 열을 추가 할 수는 없지만 새 열을 추가하는 쿼리를 작성하고 이름을 바꿀 때 새 열을 추가 할 수있는 것보다 데이터베이스와 테이블 이름이 둘 다 .. 그러나 alter table 메서드의 도움으로 나는 그렇게 할 수 없습니다 .. 데이터베이스와 테이블 이름을 바꾸는 것은 원하는 작업이 아닙니다 .. 그것은 alter와 함께 작동해야합니다 table..still 나는 테이블 방법 변경으로 그것을 할 수 없습니다
Aamirkhan

@ user370305 앱을 처음 설치하는 새 사용자를 위해 tablle create 문에 새 열을 추가해야합니까?
Ahesanali Suthar

15

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

    }

}

이것이 여러 업그레이드를 처리하는 방법입니다. 어떤 버전의 출처 확인!
Ricardo

버전 1에서 3으로 직접 이동하는 경우 (누군가 앱을 자동 업데이트하지 않는 경우) 케이스 2에 도달하지 않습니다.
TyMarc

@ TyMarc-- 예, 버전 2에서 3으로 업그레이드됩니다. 스위치는 이전 버전을 사용합니다. 따라서 귀하의 예에서 이전 버전은 1입니다. 그런 다음 코드는 버전 1에서 2로 업그레이드하는 사례 1을 실행 한 다음 2에서 3으로 업그레이드하는 사례 2 (중단이 없기 때문에)를 실행합니다. 설명에 괜찮습니다.
Edward Bagby

4

나는 다음과 같은 접근 방식을 수행했습니다.

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

Where : "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는 오래 전에 코멘트에서 언급 한 문제를 해결했을 것이라고 생각합니다. 데이터베이스 버전을 늘리지 않은 것 같습니다. 그렇지 않으면 여기에 대한 대답은 간단합니다. 테이블을 변경할 때 데이터베이스 버전 번호를 늘리거나 변경하지 않은 사람에게 도움이 될 수 있기 때문에이 글을 쓰고 있습니다.


네, 데이터베이스 이름을 변경하고 응용 프로그램을 unistalling하고 문제를 해결할 다시 재설치
아미르 칸

@Aamirkhan, 더 명확한 해결책을 대중이 사용할 수 있도록 다음 답변으로 확인을 이동하십시오.
AlleyOOP 2014 년

3

그런 상태를 확인하면 안될 것 같아요

 if (newVersion > oldVersion) {
 }

this를 사용하면 데이터베이스 버전을 늘릴 때마다 onUpdrade ()가 호출되고 condition이 true이므로 다음과 같이 확인해야합니다.

if(oldVersion==1) 
{

}

따라서이 경우 이전 버전이 2이면 조건이 거짓이되고 이전 버전 2를 사용하는 사용자는 데이터베이스를 업데이트하지 않을 것입니다 (사용자가 버전 1에 대해서만 원하는 경우).


1

테이블에 새 열을 추가하려면을 사용해야 ALTER합니다. Android에서는 새 열을onUpgrade() .

당신은 궁금 할 수 있습니다, 어떻게 onUpgrade()새 열을 어떻게 추가 할 할 것입니다.

의 하위 클래스를 구현할 때 SQLiteOpenHelper클래스 생성자 super(context, DB_NAME, null, 1);에서 superclass constructor :를 호출해야합니다 . 나는 통과했다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

코드를 변경하기 만하면됩니다.

개인 최종 int DATABASE_VERSION = 1;

...에

개인 정적 최종 정수 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

테이블에 새 열을 만드는 가장 쉬운 방법은 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");
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.