Как получить доступ к модели CoreData в сегодняшнем расширении (iOS)
Можно ли работать с моей моделью CoreData в сегодняшнем расширении в Swift, как в оригинальном приложении? Если да, как я могу создать NSManagedObjectContext?
Я действительно понятия не имею, кроме идентификатора группы, но, к сожалению, я не знаю, как получить контекст...
В прошлом я создавал приложения с проверкой вначале, что я хочу использовать CoreData, а затем я получил managedObjectContext через мой 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"];
Затем в вашем расширении просто создайте постоянный координатор хранилища с контекстами управляемого объекта, используя базу данных в общем контейнере. Вы можете поделиться своей моделью (.momd) и подклассами управляемого объекта с расширением, просто убедившись, что они также включены в расширение расширения.
Редактировать:
Чтобы добавить модель и подклассы управляемого объекта:
Убедитесь, что у вас есть цель приложения и расширения
Нажмите на файл модели и выберите обе цели в разделе "Целевое членство" на правой панели.
- Повторите то же самое со всеми подклассами управляемого объекта.