2014-04-15 40 views
7

Tôi có một ứng dụng dựa trên dữ liệu cốt lõi sử dụng Dropbox để sao lưu và khôi phục dữ liệu. Cách tôi sao lưu khá thẳng về phía trước. Tôi sao chép tệp .sqlite trên tài khoản đăng của người dùng.Sao lưu .sqlite (Dữ liệu chính)

Hiện tại, chức năng sao lưu và khôi phục của tôi đang hoạt động tốt. Vấn đề là với tập tin .sqlite. Dường như tệp .sqlite là không đầy đủ.

Tôi đã nhập khoảng 125 mục nhập trong đơn đăng ký của mình và đã sao lưu. Bản sao lưu xuất hiện trong tài khoản đăng của tôi nhưng khi tôi sử dụng công cụ thám hiểm .sqlite để xem nội dung, tôi chỉ thấy bản ghi tối đa 117 mục nhập.

Tôi đã thử cập nhật mục nhập đầu tiên và sau đó lại quan sát tệp .sqlite nhưng không thay đổi lại.

Điều kỳ lạ hơn nữa là ứng dụng dường như đã ghi lại tất cả thay đổi. Khi tôi thêm một mục mới hoặc cập nhật một mục hiện có và khởi động lại ứng dụng, dữ liệu mới được thêm vào dường như vẫn tồn tại. Nhưng dữ liệu mới được thêm này không xuất hiện trong tệp .sqlite của tôi.

Tôi sao lưu sử dụng mã này:

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]; 

} 

Tôi cũng sao chép các tập tin từ thư mục .sqlite của Simulator và cố gắng nhìn thấy nó trong trình duyệt .sqlite. Nó vẫn thể hiện hành vi tương tự. Bất kỳ lý do tại sao điều này phải xảy ra?

Trả lời

6

Bắt đầu với iOS 7/OS X 10.9, Dữ liệu chính sử dụng "Ghi nhật ký ghi trước" (WAL) làm chế độ ghi nhật ký mặc định cho tệp lưu trữ SQLite cơ bản. Này được giải thích trong

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

Với chế độ WAL, Core Data giữ các tập tin lưu trữ chính bị ảnh hưởng và gắn thêm các giao dịch vào một tập tin -wal trong cùng một vị trí. Sau khi bối cảnh Dữ liệu cốt lõi được lưu, tệp -wal sẽ không bị xóa và dữ liệu trong tệp đó không được hợp nhất vào tệp lưu trữ. Do đó, chỉ cần tạo bản sao của tệp lưu trữ có khả năng sẽ làm mất dữ liệu và không thống nhất.

Điều đó sẽ giải thích tại sao tệp .sqlite của bạn không hoàn chỉnh. Như là giải pháp bạn có thể (hay còn được giải thích trong đó Lưu ý kỹ thuật):

  • Disable WAL-mode (và sử dụng "cũ" chế độ rollback journaling) cho các cửa hàng SQLite bằng cách thiết lập

    @{NSSQLitePragmasOption:@{@"journal_mode":@"DELETE"}}; 
    

    tùy chọn khi thêm các cửa hàng liên tục, hoặc

  • Sử dụng

    - (NSPersistentStore *)migratePersistentStore:(NSPersistentStore *)store toURL:(NSURL *)URL options:(NSDictionary *)options withType:(NSString *)storeType error:(NSError **)error 
    
    Phương thức 210

    để tạo bản sao dự phòng của kho dữ liệu Core.

+0

Vì vậy, bạn sẽ đề xuất điều gì? Apple đề xuất phương pháp tiếp cận thứ hai của bạn nhưng tôi không hiểu làm thế nào tôi có thể sử dụng với dropbox (nó trông phù hợp cho iCloud). Nếu tôi tắt chế độ WAL ngay bây giờ, liệu tôi có bị mất dữ liệu đã nhập không?Và bạn nghĩ gì về việc tạo một tệp zip với tệp .sqlite và tệp wal và lưu nó dưới dạng bản sao lưu (và làm ngược lại để khôi phục)? –

+0

@GauravWadhwani: Trong câu trả lời này http://stackoverflow.com/a/21002923/1187415, có nghĩa là mở cửa hàng với journal_mode = DELETE không * không * phá hủy dữ liệu của bạn, nhưng tôi chưa thử nghiệm nó. Với cách tiếp cận thứ hai, bạn có thể phải sao lưu vào một cửa hàng riêng lẻ (single-file) đầu tiên mà sau đó bạn có thể chuyển đến dropbox (nhưng tôi không quen với các chức năng dropbox). - Rất tiếc, tôi không thể đưa ra đề xuất cho bạn. Có lẽ một câu trả lời khác sẽ đến và giúp đỡ nhiều hơn. –

+0

Cảm ơn câu trả lời của bạn. Giúp tôi giải quyết vấn đề của mình :) –

Các vấn đề liên quan