Android SQLite Migration: Veri Kaybı Olmadan Şema Güncellemesi
Android uygulamanız canlıya çıktıktan sonra veritabanı şeması değişmesi kaçınılmazdır. Yeni bir tablo eklemek, kolon silmek ya da veri tipini değiştirmek gerekebilir. burada migration (göç) stratejileri devreye girer. Yanlış yaparsanız kullanıcıların tüm verileri silinebilir.
SQLite'da veritabanı şeması değiştiğinde DATABASE_VERSION numarasını artırırsınız. Android, uygulamayı güncelleyen kullanıcıların cihazında eski versiyon bulunca onUpgrade() metodunu çalıştırır. Burada eski şemadan yeni şemaya geçiş yaparsınız.
1public class DatabaseHelper extends SQLiteOpenHelper {2private static final String DATABASE_NAME = "myapp.db";3private static final int DATABASE_VERSION = 2; // Eski: 1, Yeni: 245public DatabaseHelper(Context context) {6super(context, DATABASE_NAME, null, DATABASE_VERSION);7}89@Override10public void onCreate(SQLiteDatabase db) {11// İlk kurulumda tablo oluştur12db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)");13}1415@Override16public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {17if (oldVersion < 2) {18// Versiyon 1'den 2'ye geçiş: age kolonu ekle19db.execSQL("ALTER TABLE users ADD COLUMN age INTEGER DEFAULT 0");20}21}22}Eğer kolon silmek ya da veri tipi değiştirmek gerekirse, SQLite ALTER TABLE DROP COLUMN desteklemediğinden yeni tablo oluşturup veriyi taşımanız lazım:
1@Override2public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {3if (oldVersion < 2) {4// Eski tabloyu yeniden adlandır5db.execSQL("ALTER TABLE users RENAME TO users_old");67// Yeni şemayla tablo oluştur (status kolonu eklendi)8db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT, status TEXT DEFAULT 'active')");910// Eski veriler yeni tabloya kopyala11db.execSQL("INSERT INTO users (id, name, email) SELECT id, name, email FROM users_old");1213// Eski tabloyu sil14db.execSQL("DROP TABLE users_old");15}16}Uygulama başladığında getReadableDatabase() çağrılırsa, versiyon uyuşmazlığı otomatik olarak onUpgrade() tetikler:
1DatabaseHelper dbHelper = new DatabaseHelper(context);2SQLiteDatabase db = dbHelper.getReadableDatabase(); // onUpgrade() burada çalışırMigration öncesinde her zaman yedek alın. onUpgrade() içinde transaction kullanarak atomiklik sağlayın: başarısız olursa tüm işlem geri alınır. Yeni kolon ekliyorsanız DEFAULT değeri belirleyin; eski satırlara otomatik uygulanır. Üretim ortamında migration testi yapın.
Versiyon numarası arttıkça if (oldVersion < X) kontrolleriyle zincir oluşturun. Böylece versiyon 1'den doğrudan 3'e atlayan kullanıcı da sorunsuz migrate olur.
0 yorum