2016-12-10 3 views
5

Im пытается получить объекты из моей базы данных coredata моего основного приложения и отображать их в виджетах моих приложений Расширение. Однако выборка всегда возвращает пустые результаты из моей базы данных. Может мне помочь. Swift 3, ios 10.Получение из Coredata в расширении виджета приложения ios в ios 10

+0

Это очень широкий вопрос со многими возможными проблемами. Есть ли сообщение об ошибке? Является ли база данных пустой? Можете ли вы показать код? – Jerry

+0

Вы должны использовать общий каталог для приложения и расширения, используя «Группы приложений» (Google it). – shallowThought

+0

Да, мне удалось создать группы приложений для приложения, но я не могу получить доступ к каталогу coredata для API ios 10. ядро Data Ios 9 имеет метод в appdelegate для доступа к каталогу документов базы данных, но с новым стеком данных Ios 10 Core, который был удален, и им трудно получить доступ к каталогу для моей основной базы данных, чтобы поделиться каталог между компонентами моих групп приложений. Любая помощь? –

ответ

4

Сегодня Extension запускается в другом процессе из своего содержащего приложения, таким образом, не обменивается изолированной песочницей, UserDefaults или базой данных. Вот почему вы получаете пустой набор при попытке извлечь данные, сохраненные в контейнере, из виджета. Если вы хотите, чтобы содержащее приложение и виджет обменивались данными, вы должны добавить в свое приложение функцию «Группа приложений» через портал разработчиков iOS и предоставить ему строку идентификатора разделяемой группы. Затем, когда вы создаете экземпляр объекта FileManager для базы данных (или UserDefaults), вы должны использовать метод initWithSuiteName, передавая идентификатор общей группы.

+0

Можете ли вы указать пример кода для этого –

+0

Только что увидел ваш комментарий, я вижу, вы уже решили его. –

4

Я решил. После создания группы приложений я создал подкласс 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 
}() 

Надеется, что это помогает вне

+2

У вас есть образец кода для вашего подхода? – cr0ss

+0

Пример кода будет спасателем жизни –

+0

надеюсь, что это поможет вам –