我剛剛發佈了一款名爲Twinstones的應用程序,並且我不斷更新它,但是現在我希望更新我的Core Data模型對象。當用戶第一次打開應用程序(基本上每次都是)後,我使用一個NSUserDefaults
對象來檢查我的模型對象是否已經進行了初始設置。如果默認對象的值爲0,則初始化設置,如果爲1,則忽略該設置。如何爲現有應用程序的新實體實施核心數據遷移(如果有必要)
在這一點上,顯然,已經完成了所有70個下載遊戲的人的初始設置。
我想爲第一級的教程添加一個實體,並使用Core Data來跟蹤教程是否已被查看,這意味着我必須將現在的舊模型對象遷移到此新的實體。在開始之前,我是否應該使用另一個NSUserDefault
對象(以與初始設置相同的方式應用)來確定是否在第一級上運行教程?
如果不是,這是我對管理對象上下文代碼,管理對象模型和持久存儲協調:
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
// from website
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"ScoreModel" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
// from website
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory]
URLByAppendingPathComponent:@"Twinstones.sqlite"];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:nil
error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
在我persistantStoreCoordinator
方法,我將如何實施遷移?鑑於默認對象已經通過初始化,我覺得我不得不添加另一個默認對象,獲取對當前模型對象的引用,將其遷移並添加新的實體。
我從來沒有真正做過這個,所以真正破解了代碼(如果再次,這種遷移甚至是必要的)。如果我只能使用另一個NSUserDefaults
對象,並且保證其存儲數據的屬性列表不會意外變得惡意,那麼我會這樣做。