Как получить доступ к модели 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) и подклассами управляемого объекта с расширением, просто убедившись, что они также включены в расширение расширения.

Редактировать:

Чтобы добавить модель и подклассы управляемого объекта:

1. Убедитесь, что у вас есть цели приложения и расширения

  1. Убедитесь, что у вас есть цель приложения и расширения

    2. Нажмите на файл модели и выберите обе цели в разделе

  2. Нажмите на файл модели и выберите обе цели в разделе "Целевое членство" на правой панели.

    3. Повторите то же самое со всеми подклассами

  3. Повторите то же самое со всеми подклассами управляемого объекта.
Другие вопросы по тегам