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: 2
4
5public DatabaseHelper(Context context) {
6super(context, DATABASE_NAME, null, DATABASE_VERSION);
7}
8
9@Override
10public void onCreate(SQLiteDatabase db) {
11// İlk kurulumda tablo oluştur
12db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)");
13}
14
15@Override
16public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
17if (oldVersion < 2) {
18// Versiyon 1'den 2'ye geçiş: age kolonu ekle
19db.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:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1@Override
2public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
3if (oldVersion < 2) {
4// Eski tabloyu yeniden adlandır
5db.execSQL("ALTER TABLE users RENAME TO users_old");
6
7// 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')");
9
10// Eski veriler yeni tabloya kopyala
11db.execSQL("INSERT INTO users (id, name, email) SELECT id, name, email FROM users_old");
12
13// Eski tabloyu sil
14db.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ışır

Migration ö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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz