2012-04-13 13 views
5

Uygulama deposuna (sürüm 1.0) bir uygulama yükledim. Uygulamam, bazı verileri depolamak için bir sqlite veritabanı kullanıyor. Şimdi veritabanında bazı değişiklikler yaptım (db'mdeki tablolardan birinde 2 veya 3 yeni sütun ekledim). Uygulamamın önceki sürümünü yeni sürüm 1.1 ile (farklı db yapısına sahip) güncellemek istiyorum. Şimdi, 1.0 sürümü kullanan kullanıcılar uygulamayı 1.1 sürümüne yükselttiğinde, db zaten uygulama sanal alanında mevcut ve bu nedenle, uygulama 1.1 sürümüne işaret ediyor, ancak db hala eski olanı. Varsa, eski verilerle yeni db'ye sahip olmak istiyorum. Lütfen bana yardım edin. Teşekkürler.Farklı bir sürümü ile mağazaya yeni sürümü güncelleme sqlite db yapısı

+0

Veritabanını yükseltme stratejisi için http://stackoverflow.com/a/9851554/108574 adresindeki yanıtımı kontrol edin. –

+0

@HeShiming Teşekkürler dostum. Ancak, sürüm 1.0'ı uygulama mağazasına zaten yükledim ve bir meta veri tablonuz yok (önerdiğiniz gibi veritabanı sürümünü depolamak için). Şimdi yeni bir versiyon yüklemek istiyorum ve db yapısında bir değişiklik var. Peki şimdi nasıl başarabilirim? – anshul

+0

iyi yöntem hala geçerli. Seçili ifadenin dönüş değerini kontrol ederek meta veri tablosunun varlığını kontrol etmeniz yeterlidir. O zaman mevcut değilse, bir tane oluşturun. –

cevap

12

sqlite uygulamanızın db geçerli şema sürümü için sorgulamak için PRAGMA user_version yürütebileceği, user_version özelliği olarak adlandırılan şey destekler. Bu sorgu, uygulamanızın başladığı sırada başlangıçta yazılabilir.

bu user_version güncelleme sorgusu PRAGMA user_version = version_num aşağıdaki yürütmek güncellemek için;

Eğer sqlite db oluşturduğunuzda

, gelecekte yükseltme yaparken mevcut değerini sorgulamak, böylece bu özellik user_version koymak iyi uygulamadır. Şema sürümünüzü yükseltmek için neyin gerekip gerekmediğini kontrol edin ve kalanları değiştirin veya tablolar oluşturun.

Örneğin

: İlk sürümde

Ben col1 ile table1 oluşturmak, col2

Ben table1 oluşturmak için sql çalıştırmak ve başarıyla bittiğinde, i = 1 yani bu gösterecektir Pragma user_version yürütmek benim geçerli şema sürümü, i, 2

Ben ilk sorgu user_version benim şema sürümünü değiştirmek gerekir onun değer kontrol edin ve 1 ise, o zaman değiştirmek çalıştırmak için gereken i yeni Col3 eklemek gelecek sürümde 1

olduğunu eklenecek komut dosyası Yeni sütun ve durumda 2.

ayarlı kullanıcı sürümü, daha önce user_version ayarlamadıysanız beri, yeni bir yükseltme senaryosu vs yüklemek ayırt etmek zor olurdu. Şimdilik, eğer db mevcutsa, senaryoya yükseltme senaryosu olup, komut dosyalarını değiştirir ve varsa, yeni bir yükleme senaryosu olduğunu varsayın ve komut dosyaları oluşturmaya çalışın. Ama gelecekteki atneast sorununuzu çözmek için yukarıdaki pragma kullanabilirsiniz eğer bakın.

+0

veritabanı şemasını güncelleştirmek ve korumak için iyi bir yol gibi görünüyor, kesinlikle bunu deneyeceğim. –

-1
eski db, ve böylece, (geçici bir adla) yeni yapısı ile yeni db oluşturmak için bir rutin var, eskiden yeniye tüm verileri kopyalama yaparsanız kapatmak eğer fırlatma kontrol edebilir

eski db & silin, yeni db'yi kapatın, yeniden adlandırın ve ardından güncellenmiş uygulamanızın kullanımı için tekrar açın. Kolay, hızlı, & yapmak için SQLite hakkında derin bir bilgiye ihtiyacınız yoktur.

+0

Ancak bu şeyi yalnızca kullanıcı 1.0'dan 1.1 sürümüne yükselttiğinde yapmak istiyorum. Anlattığınız yaklaşım, app delegate uygulamasında appDidFinishLaunching yönteminde uygulanacak ve bu nedenle, her defasında uygulamanızı başlattığımda bu kod satırları çalıştırılacak. Sağ??? Yani, sqlite veritabanı sürüm numarası gibi bir şeye ihtiyacım var. – anshul

+0

Öyle değil - sadece db yeni yapı olup olmadığını kontrol etmek veya – SomaMan

İlgili konular