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 대신 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
}
}
나는 다음과 같은 접근 방식을 수행했습니다.
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;";
위의 두 작업 후에는 새로 설치 사용자 및 앱 업그레이드 사용자에게 잘 작동합니다.
@ Aamirkhan.i는 오래 전에 코멘트에서 언급 한 문제를 해결했을 것이라고 생각합니다. 데이터베이스 버전을 늘리지 않은 것 같습니다. 그렇지 않으면 여기에 대한 대답은 간단합니다. 테이블을 변경할 때 데이터베이스 버전 번호를 늘리거나 변경하지 않은 사람에게 도움이 될 수 있기 때문에이 글을 쓰고 있습니다.
테이블에 새 열을 추가하려면을 사용해야 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");
}
}
같은 문제를 검색하는 동안 링크를 발견했습니다. 업그레이드 사용 방법을 설명합니다. 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");
}
}