2014-04-15 19 views
7

yedekleme için Dropbox'ı kullanır ve veri geri bir çekirdek veri tabanlı bir uygulama. Yedeklediğim yol çok açık. .sqlite dosyasını kullanıcının dropbox'ına kopyalarım.yedekleme .sqlite (Çekirdek veri)

Şimdi benim yedekleme ve işlevselliği geri iyi çalışıyor. Sorun .sqlite dosyasının kendisi ile. .sqlite dosyasının tamamlanmamış olduğu anlaşılıyor.

benim uygulamada yaklaşık 125 girdileri girdi ve bir yedek sürdü. Yedekleme benim dropbox'ımda göründü, ancak içerikleri görmek için bir .sqlite explorer aracı kullandığımda, sadece 117. girişe kadar kayıtları görüyorum.

İlk girdiyi güncelleştirmeyi denedim ve daha sonra tekrar .sqlite dosyasını gözlemlemeyi denedim ancak bir daha değiştirmem.

Daha da garip olan şey, uygulamanın tüm değişiklikleri kaydetmiş gibi göründüğü. Yeni bir giriş eklediğimde veya mevcut olanı güncellediğimde ve uygulamayı yeniden başlattığımda, yeni eklenen veriler devam ediyor gibi görünüyor. Ancak bu yeni eklenen veriler .sqlite dosyasımda görünmüyor.

Bu kodu kullanarak yedekleme ediyorum:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
NSString *filePath = [[[appDelegate applicationDocumentsDirectory] path] stringByAppendingPathComponent:@"MyApp.sqlite"]; 


if (account) { 
    if ([filesystem isShutDown]) { 
     filesystem = [[DBFilesystem alloc] initWithAccount:account]; 
     [DBFilesystem setSharedFilesystem:filesystem]; 
    } 

    DBPath *newPath = [[DBPath root] childPath:[NSString stringWithFormat:@"Backup - %@.sqlite", [NSDate date]]]; 
    DBFile *file = [[DBFilesystem sharedFilesystem] createFile:newPath error:nil]; 
    [file writeContentsOfFile:filePath shouldSteal:NO error:nil]; 
    [filesystem shutDown]; 

} 

Ben de simülatörümüzün klasöründen .sqlite dosyayı kopyalanıp .sqlite tarayıcıda görmeye çalıştı. Hala aynı davranışı sergiliyor. Bunun olması için bir sebep var mı?

cevap

6

iOS 7/OS X 10.9 ile başlayarak, Temel Veriler, alttaki SQLite deposu dosyası için varsayılan olarak günlük kaydı modunu kullanarak "Write-Ahead Logging" (WAL) kullanır. Bu Çekirdek Veri bakir ana mağaza dosyasını tutar ve aynı yerde bir -wal dosyaya işlemleri ekler WAL modu

Technical Q&A QA1809: New default journaling mode for Core Data SQLite stores in iOS 7 and OS X Mavericks

açıklanmıştır. Çekirdek Veri bağlam kaydedildikten sonra -wal dosya silinmez ve veri bu dosyada ya mağaza dosyasına birleştirilmez. Bu nedenle, yalnızca mağaza dosyasının kopyasını oluşturma, veri kaybına ve tutarsızlığına neden olacaktır.

Bu, .sqlite dosyanızın neden tek başına eksik olduğunu açıklamalıdır. çözüm olarak olarak, (aynı zamanda o Teknik dipnotta açıklanmıştır) olabilir:

  • Devre Dışı Wal-modu (ve "eski" geri alma günlük kaydı modunu kullanmak)

    @{NSSQLitePragmasOption:@{@"journal_mode":@"DELETE"}}; 
    
    ayarlayarak SQLite mağaza için kalıcı depo ekleme

    seçenek veya

  • - (NSPersistentStore *)migratePersistentStore:(NSPersistentStore *)store toURL:(NSURL *)URL options:(NSDictionary *)options withType:(NSString *)storeType error:(NSError **)error 
    
    kullanın Çekirdek Veri deposunun bir yedek kopyasını yapmak için 210

    yöntemi.

+0

Peki ne önerirsiniz? Apple ikinci yaklaşımınızı önerir, ancak bunu dropbox ile nasıl kullanabileceğimi anlamıyorum (iCloud için uyarlanmış görünüyor). WAL modunu şimdi devre dışı bırakırsam, girilmiş olan verileri kaybeder miyim?Ve .sqlite dosyası ve wal dosyası ile bir zip dosyası oluşturma ve yedekleme olarak kaydetme hakkında ne düşünüyorsunuz (ve geri yüklemek için tersi)? –

+0

@GauravWadhwani: Bu cevapta http://stackoverflow.com/a/21002923/1187415 adresinde store_mode = DELETE ile mağazayı açmanız * verilerinizi yok etmediğini, ancak kendim test etmediğimi belirtiyor. İkinci yaklaşımla muhtemelen önce ayrı bir (tek dosya) depoya yedeklemeniz gerekir, bu da daha sonra dropbox'a taşıyabilirsiniz (ancak dropbox işlevlerine aşina değilim). - Üzgünüm, sana tavsiyede bulunamam. Belki başka bir cevap gelecek ve daha fazla yardımcı olacaktır. –

+0

Cevabınız için teşekkürler. Sorunumu çözmeme yardım etti :) –

İlgili konular