ProgramingTip

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

bestdevel 2020. 10. 15. 08:08
반응형

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


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

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

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


다음 과 같이 메소드에서 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는 열 정의에 따라 늘어납니다.


내 앱에 대한 도움이 필요할 때마다 연설을 들었습니다. 다음을 수행하는 것이 좋습니다.

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

사용자가 둘 이상의 버전을 업그레이드 할 때 코드가 작동하고 업데이트해야합니다. 이에 대한 자세한 내용은이 블로그를 확인하십시오 .


작업을 수행이하는 추론 쉬운 방법은 몇 가지 추가하는을 구석으로입니다 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");
    }
}

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

    }

}

@ Aamirkhan.i는 오래 전에 게임에서 한 문제를 해결하고 있다고 생각합니다. 데이터베이스 버전을 늘리지 않은 것입니다. 숫자는 여기에 대한 대답은 간단합니다. 테이블을 사용하기 때문에 데이터베이스 버전 번호를 늘리거나 변경하지 않은 사람에게 도움이 될 수 있기 때문에 글을 쓰고 있습니다.


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

 if (newVersion > oldVersion) {
 }

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

if(oldVersion==1) 
{

}

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


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

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

위의 두 작업 후 새로 설치 사용자 및 앱 업그레이드 사용자에게 잘 작동합니다.


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

onUpgrade()새 열을 어떻게 추가 할 것인지 궁금 할 것입니다.

의 서브 클래스를 구현할 때 SQLiteOpenHelper클래스 생성자 super(context, DB_NAME, null, 1);에서 슈퍼 클래스 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");
    }
}

같은 문제를 검색하는 동안 링크를 발견했습니다. 업그레이드 사용 방법을 설명합니다. 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);
        }
    }

테이블에 새 열을 만드는 가장 쉬운 방법은 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");
    }
}

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

개인 최종 int DATABASE_VERSION = 1;

...에

개인 정적 최종 정수 DATABASE_VERSION = 2;

참고 URL : https://stackoverflow.com/questions/8291673/how-to-add-new-column-to-android-sqlite-database

반응형