[android] 안드로이드에서 SQLite 데이터베이스 마이그레이션

안드로이드 앱을 개발하다 보면 데이터베이스 스키마를 변경해야 할 때가 있습니다. 이럴 때 데이터베이스 마이그레이션은 필수적입니다.

SQLiteOpenHelper를 사용한 데이터베이스 마이그레이션

SQLiteOpenHelper를 사용하여 데이터베이스를 관리할 때, 데이터베이스 스키마의 변경이 필요한 경우 onUpgrade 메서드를 사용하여 마이그레이션을 수행할 수 있습니다.

아래는 SQLiteOpenHelper를 사용하여 데이터베이스 마이그레이션을 수행하는 간단한 예제 코드입니다.

public class MyDatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "mydatabase.db";
    private static final int DATABASE_VERSION = 2;

    public MyDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // Initial database creation
        db.execSQL("CREATE TABLE mytable (_id INTEGER PRIMARY KEY, name TEXT)");
        // More tables and initial data setup
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Database schema upgrade logic
        if (oldVersion < 2) {
            db.execSQL("ALTER TABLE mytable ADD COLUMN age INTEGER");
        }
        // More upgrade tasks for other versions
    }
}

위의 코드에서 onUpgrade 메서드 안에 데이터베이스 스키마 변경에 관한 로직을 추가할 수 있습니다.

Room 라이브러리를 사용한 데이터베이스 마이그레이션

Room 라이브러리를 사용하는 경우에는 Migration 객체를 사용하여 데이터베이스 마이그레이션을 수행할 수 있습니다.

다음은 Room 라이브러리를 사용하여 데이터베이스 마이그레이션을 수행하는 예제 코드입니다.

@Database(entities = {MyEntity.class}, version = 2)
public abstract class MyDatabase extends RoomDatabase {
    public abstract MyDao myDao();
}

public class MainActivity extends AppCompatActivity {
    private MyDatabase myDatabase;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        myDatabase = Room.databaseBuilder(getApplicationContext(), MyDatabase.class, "mydatabase.db")
                          .addMigrations(MIGRATION_1_2, MIGRATION_2_3)
                          .build();
    }

    static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            // Migration logic from version 1 to 2
            database.execSQL("ALTER TABLE myentity ADD COLUMN age INTEGER");
        }
    };

    static final Migration MIGRATION_2_3 = new Migration(2, 3) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            // Migration logic from version 2 to 3
        }
    };
}

위의 코드에서 Migration 객체를 사용하여 각각의 버전 간에 수행해야 할 마이그레이션 로직을 정의할 수 있습니다.

안드로이드에서는 SQLite 데이터베이스를 안정적으로 관리하고 버전을 업데이트할 때 데이터베이스 마이그레이션을 수행할 수 있는 다양한 방법을 제공합니다.

데이터베이스 마이그레이션은 안정적인 데이터 관리와 앱의 성능 향상을 위해 중요합니다. 적절한 마이그레이션 전략을 선택하여 데이터베이스를 유연하게 관리하는 것이 중요합니다.