我在App Store上有一个使用Core Data的应用程序,我想进行更新。我使用预加载的sqlite文件来创建persistentStore。模型中有两个实体,其中一个实体保存用户保存的数据。
我的问题:我想用新的预加载的sqlite更新现有的核心数据,但保留用户保存的数据。有没有办法将预加载文件的新数据与用户保存的数据合并?
模型保持不变;我没有添加任何新的实体或属性,所以我认为迁移是不合适的(我可能是错的)。
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CreatureData.sqlite"];
if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {
NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"CreatureData" ofType:@"sqlite"]];
NSLog(@"JUST LOADED COREDATA SQLITE");
NSError* err = nil;
if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err]) {
NSLog(@"Oops, couldn't copy preloaded data");
}
} else {
NSLog(@"Core Data SQLITE already exists");
}
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;
}
编辑:
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CreatureData.sqlite"];
NSURL *secondStoreURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"CreatureData" ofType:@"sqlite"]];
if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {
NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"CreatureData" ofType:@"sqlite"]];
NSLog(@"JUST LOADED COREDATA SQLITE");
NSError* err = nil;
if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err]) {
NSLog(@"Oops, couldn't copy preloaded data");
}
}
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES };
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"UserSavedData" URL:storeURL options:options error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"StaticTableData" URL:secondStoreURL options:options error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
答案 0 :(得分:0)
Apple建议您将静态和用户数据分开,在这种情况下分为2个持久存储。您可以执行以下操作之一:
首选且可取的选项是,您为用户数据使用单独的商店。您需要更新数据模型以容纳两个商店,因此它将是轻量级迁移。
然后,您将从现有的sqlite存储中首次启动时提取用户数据,并将它们存储到新的动态存储中。然后,您可以删除旧的sqlite商店。
第二个选项是保持当前设置。首次运行时,使用其他名称复制新文件,然后从旧商店中提取用户数据并将其复制到新商店。然后删除旧商店。