Как получить доступ к модели CoreData в сегодняшнем расширении (iOS)
Возможно ли работать с моей моделью CoreData в сегодняшнем расширении в swift, как в исходном приложении? Если да, как я могу создать NSManagedObjectContext?
У меня действительно нет подсказки, помимо идентификатора группы, но, к сожалению, я не знаю, как получить контекст.
Раньше я создавал приложения с проверкой вначале, что я хочу использовать CoreData, а затем я получил управляемый объект ObjectContext через мой AppDelegate. Но как я могу сделать что-то подобное в расширении? Apple не предоставляет информацию об этом.
Я отредактировал эту строку в AppDelegate:
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"HTWcampus.sqlite"];
к этому (после включения группы в обе цели):
NSURL *storeURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.BenchR.TodayExtensionSharingDefaults"];
storeURL = [storeURL URLByAppendingPathComponent:@"HTWcampus.sqlite"];
NSLog(@"StoreURL2: %@", storeURL);
С тем, что существующая база данных в моем приложении исчезла (что здорово, потому что я думаю, что она работала, чтобы поместить базу данных в общий сегмент).
Но как я могу создать экземпляр моего контекста в расширении? И как я могу получить доступ к моим подклассам NSManagedObject?
В расширении у меня есть этот код:
var context: NSManagedObjectContext!
override func viewDidLoad() {
super.viewDidLoad()
var storeURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.BenchR.TodayExtensionSharingDefaults")
storeURL = storeURL?.URLByAppendingPathComponent("HTWcampus.sqlite")
let modelURL = NSBundle.mainBundle().URLForResource("HTWcampus", withExtension: "momd")
let model = NSManagedObjectModel(contentsOfURL: modelURL)
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: nil)
context = NSManagedObjectContext()
context.persistentStoreCoordinator = coordinator
}
Правильно ли это? И если да, то как я могу получить свой NSManagedObject-Subclasses? И мне нужно добавить файл momd в цель расширения? Если да, как я могу это сделать?
Ответы
Ответ 1
То, что вы действительно хотите, - это доступ к постоянному хранилищу (скорее всего, к базе данных SQLite).
Для этого вам необходимо настроить группы приложений и убедиться, что ваше хост-приложение настраивает стек основных данных с помощью общего контейнера (поэтому ваш магазин также доступен в расширении).
Что-то вроде:
NSString *containerPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:YOUR_SECURITY_APP_GROUP].path;
NSString *sqlitePath = [NSString stringWithFormat:@"%@/%@", containerPath, @"database.sqlite"];
Затем в вашем расширении просто создайте постоянный координатор хранилища с контекстами управляемых объектов, используя базу данных в совместно используемом контейнере.
Вы можете совместно использовать подклассы model (.momd) и управляемых объектов с расширением, просто убедившись, что они также включены в цель расширения.
Edit:
Чтобы добавить подклассы модели и управляемых объектов:
![1. Make sure you have your app and extension targets]()
-
Убедитесь, что у вас есть целевые приложения и расширения
![2. Click on your model file, and select both targets under 'Target Membership' on right-hand panel]()
-
Нажмите на свой файл модели и выберите обе цели в разделе "Целевое членство" на правой панели
![3. Repeat the same with all your managed object subclasses]()
- Повторите то же самое со всеми подклассами управляемых объектов