2012-01-16 40 views
10

Kế hoạch của tôi là để xóa cái cũ chồng Core Data (các NSManagedObjectModel.momd tập tin & file NSPersistentStore.sqlite) vì:Di chuyển dữ liệu lõi: Cách xóa ngăn xếp Dữ liệu cốt lõi?

  • Tôi không có kinh nghiệm với di cư Core Data.
  • lược đồ .xcdatamodel mới hoàn toàn khác với lược đồ cũ.
  • Tôi có thể xóa dữ liệu cũ của người dùng một cách an toàn vì tất cả dữ liệu được lưu trữ trên máy chủ của chúng tôi và ứng dụng mới sẽ tải xuống dữ liệu mới nhất từ ​​máy chủ của chúng tôi.

Trong trường hợp này, việc xóa hoàn toàn là cách tốt nhất để di chuyển?

Trả lời

11

Đó là điều hoàn toàn hợp lệ để làm nếu ứng dụng của bạn yêu cầu truy cập internet. Nếu không, người dùng có thể được để lại với một tập dữ liệu rỗng (bạn xóa cơ sở dữ liệu cũ khi bạn thấy nó không tương thích với mô hình hiện tại, nhưng bạn không thể điền lại nó mà không cần truy cập vào máy chủ).

Về mặt kỹ thuật, đó là một việc nhỏ nhặt cần làm. Khi bạn thiết lập các NSPersistentStoreCoordinator:

NSURL *storeURL = ...; 
NSManagedObjectModel *managedObjectModel = ...; 
NSError *error = nil; 
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: managedObjectModel]; 

// Check if we already have a persistent store 
if ([[NSFileManager defaultManager] fileExistsAtPath: [storeURL path]]) { 
    NSDictionary *existingPersistentStoreMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType: NSSQLiteStoreType URL: storeURL error: &error]; 
    if (!existingPersistentStoreMetadata) { 
     // Something *really* bad has happened to the persistent store 
     [NSException raise: NSInternalInconsistencyException format: @"Failed to read metadata for persistent store %@: %@", storeURL, error]; 
    } 

    if (![managedObjectModel isConfiguration: nil compatibleWithStoreMetadata: existingPersistentStoreMetadata]) { 
     if (![[NSFileManager defaultManager] removeItemAtURL: storeURL error: &error]) 
      NSLog(@"*** Could not delete persistent store, %@", error); 
    } // else the existing persistent store is compatible with the current model - nice! 
} // else no database file yet 

[_persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType 
              configuration: nil 
                URL: storeURL 
               options: nil 
                error: &error]; 
+0

đang nhận được lỗi mã lỗi SQLite này: 11 , 'hình ảnh đĩa cơ sở dữ liệu không đúng định dạng' ở lần khởi chạy đầu tiên sau khi cập nhật. Nhưng khi ra mắt tiếp theo, nó không phải là một vấn đề như các tập tin sqlite bị xóa. Nhưng có vẻ như tôi không thể tránh tai nạn ứng dụng này. Và để cảm thấy rằng ứng dụng bị treo ngay lập tức sau khi cập nhật là loại đáng thất vọng. bất kỳ ý tưởng ?? – raw3d

1

Nếu bạn tạo một ứng dụng Core Data trống bạn tìm mã cần thiết trong Táo ý kiến ​​trong các ứng dụng đại biểu:

If you encounter schema incompatibility errors during development, you can reduce their frequency by:

  • Simply deleting the existing store: [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]

  • Performing automatic lightweight migration by passing the following dictionary as the options parameter:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details.

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