2010-12-05 55 views
2

我的應用程序reousrce文件夾中有一個填充的sqlite數據庫。在啓動時,我想用這個sqlite數據庫的數據預載coredata-store。我在persistantStoreCoordinator方法中使用NSMigrationManager。這在第一次效果很好,並將數據附加到商店。但它會再次在每次啓動時追加數據,因此數據將在第二次啓動後被複制。我該如何解決這個問題?在數據庫中,我會使用主鍵,在數據模型中是否有類似的東西?或者我可以比較實體對象嗎?使用NSMigrationManager進行手動CoreData遷移以追加數據(預加載)

感謝Four的幫助,下面的方法使用:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
if (persistentStoreCoordinator_ != nil) { 
    return persistentStoreCoordinator_; 
} 

NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"Raetselspass.sqlite"]; 
NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; 
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Raetselspass" ofType:@"sqlite"]; 
NSURL *defaultStoreUrl = [NSURL fileURLWithPath:defaultStorePath]; 

/* 
    Set up the store. 
    For the sake of illustration, provide a pre-populated default store. 
    */ 
     // CANNOT USE THIS BELOW: WILL WORK ONCE, BUT WHEN I WILL UPDATE THE APP WITH 
     // NEW DATA TO APPEND, THEN THIS WILL NOT WORK 
// NSFileManager *fileManager = [NSFileManager defaultManager]; 
// If the expected store doesn’t exist, copy the default store. 
// if (![fileManager fileExistsAtPath:storePath]) { 
// if (defaultStorePath) { 
// [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL]; 
// } 
// } 

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 
persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 

NSError *error; 
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { 
    // Update to handle the error appropriately. 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); // Fail 
} 

//migration 
rror:&error]; 
NSError *err = nil; 
NSMigrationManager *migrator = [[NSMigrationManager alloc] initWithSourceModel:[self managedObjectModel] destinationModel:[self managedObjectModel]]; 
NSMappingModel *mappingModel = [NSMappingModel inferredMappingModelForSourceModel:[self managedObjectModel] destinationModel:[self managedObjectModel] error:&err]; 
NSError *err2; 
if (![migrator migrateStoreFromURL:defaultStoreUrl 
      type:NSSQLiteStoreType 
      options:nil 
     withMappingModel:mappingModel 
     toDestinationURL:storeUrl 
     destinationType:NSSQLiteStoreType 
    destinationOptions:nil 
     error:&err2]) 
{ 
    //handle the error 
} 
NSLog(@"import finished"); 
[migrator release]; 

return persistentStoreCoordinator_; 
} 

回答

2

如提供將合併默認的文件,如果它是存在於文件夾中的代碼。如果在合併文件後刪除文件,則不應每次加載文件。您可以設置一個用戶默認標誌來記錄它以前是否合併過。

更好的解決方案是使用默認數據創建Core Data持久性存儲並將其包含在應用程序包中。首次啓動時,將該文件複製到文檔文件夾,並將其分配給持久性存儲。該方法會更快,您不必擔心合併失敗。

+0

你能解釋一下你的意思嗎?「分配給持久存儲」。我很困惑你的推薦是不同的。 – Flaviu 2012-02-20 20:23:34