Получение данных из виджета CoreData для iOS 14

Я хочу отображать данные, полученные из Core Data, в виджете. Но @FetchRequest не работает с виджетами.

Насколько я понимаю, нам нужно создать группу приложений и сделать общий постоянный контейнер.

Я хочу знать, как читать (получать) данные о виджетах из этого общего постоянного контейнера или просто, как отображать данные, полученные из Core Data, в виджетах.


person umayanga    schedule 17.09.2020    source источник


Ответы (1)


Сначала вам нужно создать группу приложений, которая будет использоваться для создания постоянного контейнера основных данных (здесь хорошее объяснение, как это сделать)

Затем вам нужно создать свой собственный стек CoreData (пример можно найти, когда вы создаете новый пустой проект с включенным CoreData).

Предполагая, что вы уже создали свою модель Core Data (здесь она называется DataModel), теперь вам нужно установить URL-адрес контейнера для вашего настраиваемого общего местоположения контейнера:

let containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: <your_app_group>)!
let storeURL = containerURL.appendingPathComponent("DataModel.sqlite")
let description = NSPersistentStoreDescription(url: storeURL)

let container = NSPersistentContainer(name: "DataModel")
container.persistentStoreDescriptions = [description]
container.loadPersistentStores { ... }

Теперь вы можете получить managedObjectContext из общего постоянного контейнера:

let moc = CoreDataStack.shared.managedObjectContext

и выполните с ним запрос на выборку (дополнительная информация здесь)

let predicate = NSPredicate(format: "attribute1 == %@", "test")
let request = NSFetchRequest<SomeItem>(entityName: "SomeItem")
let result = try moc.fetch(request)

Помимо всех приведенных выше ссылок, я рекомендую вам также прочитать этот учебник по Core Data:


Вот репозиторий GitHub с различными примерами виджетов, включая Core Data Widget. < / sub>

person pawello2222    schedule 17.09.2020
comment
Спасибо pawello2222 за подробный ответ. Чтобы уточнить ответ pawello2222, если вы используете CloudKit, замените NSPersistentContainer на NSPersistentCloudKitContainer (даже во вновь созданном стеке CoreData) - person umayanga; 19.09.2020
comment
Привет, pawello2222, большое спасибо за ответ и за то, что поделились этим репозиторием GitHub. Я следил за кодом в этом репозитории, и мой виджет обновляется полностью. Но я потерял все данные в моем старом managedObjectContext. Подскажите, пожалуйста, как перенести данные из старого managedObjectContext в новый managedObjectContext в стеке CoreData? - person Alex; 31.10.2020
comment
@Alex Это потому, что вы создаете новый NSPersistentContainer, который находится в другом месте, чем ваш старый. Вам необходимо переместить / скопировать старый контейнер на новое место. Этот пост может вам помочь: iOS 11+ Как перенести существующие основные данные в общую группу приложений для использования в расширении? - person pawello2222; 31.10.2020
comment
Большое спасибо @ pawello2222 - person Alex; 01.11.2020
comment
@Luca Вам нужно убедиться, что все, что нужно в виджете, добавлено в цель виджета. Если вы планируете использовать Core Data и пользовательские классы в виджете, вам необходимо добавить их все в цель виджета. - person pawello2222; 21.01.2021