Ответ 1
Основные данные. Хранилище NSSQLiteStoreType, созданное с параметрами по умолчанию, фактически представляет собой несколько файлов, как описано в Технический Q & A 1809: Новый режим ведения журнала по умолчанию для хранилищ Core Data SQLite в iOS 7 и OS X Mavericks. Это важно помнить при попытке переместить хранилище за пределы процесса миграции и является источником вашей проблемы - вы перемещаете один файл, когда вам нужно перемещать все из них. Однако перемещение файлов отдельно за пределами Core Data и без преимуществ файлового координатора не рекомендуется. Вместо этого лучше использовать миграцию.
Миграция приведет данные из хранилища источника и перенесет их в новое хранилище, по существу, реплицируя старые данные в новое место. Старые данные по-прежнему будут существовать в файловой системе. В своем приложении вы должны выполнить миграцию так, как сейчас, но не пытайтесь переместить старые данные в новое место самостоятельно - вот что происходит в этом случае.
Вместо того, чтобы перемещать файлы вокруг себя, вы можете рассчитывать на миграцию, чтобы переместить данные для вас. Во-первых, добавьте хранилище в постоянный координатор хранилища с URL-адресом исходных данных. Затем вы выполните перенос для перемещения этих данных на новый URL
NSPersistentStore *sourceStore = nil;
NSPersistentStore *destinationStore = nil;
NSDictionary *storeOptions = @{ NSSQLitePragmasOption : @{ @"journal_mode" :
@"WAL" } };
// Add the source store
if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:oldStoreURL options:storeOptions error:&error]){
// Handle the error
} else {
sourceStore = [coordinator persistentStoreForURL:oldStoreURL];
if (sourceStore != nil){
// Perform the migration
destinationStore = [coordinator migratePersistentStore:sourceStore toURL:storeURL options:storeOptions withType:NSSQLiteStoreType error:&error];
if (destinationStore == nil){
// Handle the migration error
} else {
// You can now remove the old data at oldStoreURL
// Note that you should do this using the NSFileCoordinator/NSFilePresenter APIs, and you should remove the other files
// described in QA1809 as well.
}
}
}
После завершения миграции вы можете удалить старые файлы. В приведенном здесь примере явно указаны параметры журнала SQLite, это означает, что если параметры по умолчанию будут изменены в будущем, код все равно будет работать. Если вы используете разные варианты, вы должны использовать их вместо этого.