核心数据将数据移动到共享容器中
Core Data move data into shared container
我已经发布了一个使用核心数据的应用程序。
现在我想添加对 watch kit 和 today 扩展的支持。
我需要将核心数据移动到共享容器中而不丢失以前用户保存的数据,我怎样才能以最好的方式做到这一点?
以下是我将核心数据移动到我的应用程序中的共享容器的方法。我在应用程序启动时执行此操作。
NSUserDefaults* sharedDefs = [GPMapCore sharedCore].sharedUserDefaults;
if (![sharedDefs boolForKey:@"CoreDataMovedToExtension"])
{
NSURL* oldLocation = GET_LOCATION_OF_CORE_DATA_SQLITE_FILE();
NSURL* newLocation = GET_LOCATON_TO_MOVE_THE_SQLITE_FILE_TO();
if ([[NSFileManager defaultManager] fileExistsAtPath:[oldLocation filePathString]])
{
//Check if a new file exists. This can happen when the watch app is run before
//Topo Maps+ runs and move the core data database
if ([[NSFileManager defaultManager] fileExistsAtPath:[newLocation filePathString]])
{
[[NSFileManager defaultManager ] removeItemAtURL:newLocation error:nil];
}
[[NSFileManager defaultManager] moveItemAtURL:oldLocation toURL:newLocation error:nil];
}
[sharedDefs setBool:YES forKey:@"CoreDataMovedToExtension"];
[sharedDefs synchronize];
}
您可以迁移 Core Data Stack。 A fuller answer can be found here,但短版本是:
- 检查数据的旧非组副本是否存在
- 如果是,请使用该文件设置核心数据堆栈。然后使用
migratePersistentStore:toURL:options:withType:error:
将其移动到新位置。然后删除旧副本。
- 如果旧版本不存在,只需照常使用新副本设置 Core Data。
( 答案的问题是它假定核心数据堆栈是单个 SQLite 文件,这并不总是正确的。)
我已经发布了一个使用核心数据的应用程序。
现在我想添加对 watch kit 和 today 扩展的支持。
我需要将核心数据移动到共享容器中而不丢失以前用户保存的数据,我怎样才能以最好的方式做到这一点?
以下是我将核心数据移动到我的应用程序中的共享容器的方法。我在应用程序启动时执行此操作。
NSUserDefaults* sharedDefs = [GPMapCore sharedCore].sharedUserDefaults;
if (![sharedDefs boolForKey:@"CoreDataMovedToExtension"])
{
NSURL* oldLocation = GET_LOCATION_OF_CORE_DATA_SQLITE_FILE();
NSURL* newLocation = GET_LOCATON_TO_MOVE_THE_SQLITE_FILE_TO();
if ([[NSFileManager defaultManager] fileExistsAtPath:[oldLocation filePathString]])
{
//Check if a new file exists. This can happen when the watch app is run before
//Topo Maps+ runs and move the core data database
if ([[NSFileManager defaultManager] fileExistsAtPath:[newLocation filePathString]])
{
[[NSFileManager defaultManager ] removeItemAtURL:newLocation error:nil];
}
[[NSFileManager defaultManager] moveItemAtURL:oldLocation toURL:newLocation error:nil];
}
[sharedDefs setBool:YES forKey:@"CoreDataMovedToExtension"];
[sharedDefs synchronize];
}
您可以迁移 Core Data Stack。 A fuller answer can be found here,但短版本是:
- 检查数据的旧非组副本是否存在
- 如果是,请使用该文件设置核心数据堆栈。然后使用
migratePersistentStore:toURL:options:withType:error:
将其移动到新位置。然后删除旧副本。 - 如果旧版本不存在,只需照常使用新副本设置 Core Data。
(