Подтвердить что ты не робот

Как получить доступ к модели 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 в цель расширения? Если да, как я могу это сделать?

4b9b3361

Ответ 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

  • Повторите то же самое со всеми подклассами управляемых объектов