Im пытается получить объекты из моей базы данных coredata моего основного приложения и отображать их в виджетах моих приложений Расширение. Однако выборка всегда возвращает пустые результаты из моей базы данных. Может мне помочь. Swift 3, ios 10.Получение из Coredata в расширении виджета приложения ios в ios 10
ответ
Сегодня Extension запускается в другом процессе из своего содержащего приложения, таким образом, не обменивается изолированной песочницей, UserDefaults или базой данных. Вот почему вы получаете пустой набор при попытке извлечь данные, сохраненные в контейнере, из виджета. Если вы хотите, чтобы содержащее приложение и виджет обменивались данными, вы должны добавить в свое приложение функцию «Группа приложений» через портал разработчиков iOS и предоставить ему строку идентификатора разделяемой группы. Затем, когда вы создаете экземпляр объекта FileManager для базы данных (или UserDefaults), вы должны использовать метод initWithSuiteName, передавая идентификатор общей группы.
Можете ли вы указать пример кода для этого –
Только что увидел ваш комментарий, я вижу, вы уже решили его. –
Я решил. После создания группы приложений я создал подкласс NSPersistentContainer и переопределив метод класса defaultDirectory(), чтобы вернуть каталог общих групп приложений. Также переопределите init (name: String, managedObjectModel model: NSManagedObjectModel). Затем в стеке coredata вы заменяете код persistentcontainer на шаблонный шаблон новым экземпляром созданного класса PersistentContainer.
import UIKit
import CoreData
class PersistentContainer: NSPersistentContainer{
override class func defaultDirectoryURL() -> URL{
return FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.bundleId.SomeApp")!
}
override init(name: String, managedObjectModel model: NSManagedObjectModel) {
super.init(name: name, managedObjectModel: model)
}
}
Тогда в CoreDataStack код * везде, где это возможно, либо в AppDelegate или или отдельный файл. Мой был в своем собственном файле с именем CoredataStack
static var persistentContainer:PersistentContainer = {
let container = PersistentContainer(name: "SomeApp", managedObjectModel: CoreDataStack.managedObjectModel)
container.loadPersistentStores(completionHandler: { (storeDescription:NSPersistentStoreDescription, error:Error?) in
if let error = error as NSError?{
fatalError("UnResolved error \(error), \(error.userInfo)")
}
})
return container
}()
Надеется, что это помогает вне
У вас есть образец кода для вашего подхода? – cr0ss
Пример кода будет спасателем жизни –
надеюсь, что это поможет вам –
Это очень широкий вопрос со многими возможными проблемами. Есть ли сообщение об ошибке? Является ли база данных пустой? Можете ли вы показать код? – Jerry
Вы должны использовать общий каталог для приложения и расширения, используя «Группы приложений» (Google it). – shallowThought
Да, мне удалось создать группы приложений для приложения, но я не могу получить доступ к каталогу coredata для API ios 10. ядро Data Ios 9 имеет метод в appdelegate для доступа к каталогу документов базы данных, но с новым стеком данных Ios 10 Core, который был удален, и им трудно получить доступ к каталогу для моей основной базы данных, чтобы поделиться каталог между компонентами моих групп приложений. Любая помощь? –