2017-01-16 14 views
6

Я разрабатываю расширение приложения и общего доступа и пытаюсь использовать основные данные. Но когда я вставляю элементы в расширение, эти элементы видны только в расширении, но не из приложения-контейнера (например, я выполняю NSFetchRequest из приложения и получая нулевые элементы, но в приложении i получил> 0). Я использую следующий код для получения сохраняющегося контейнера:Доступные данные ядра как из контейнерного приложения, так и для расширения

lazy var persistentContainer: NSPersistentContainer = { 

    let container = NSPersistentContainer(name: "appname") 
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
     if let error = error { 

      fatalError("Unresolved error \(error)") 
     } 
    }) 
    return container 
}() 

Кроме того, судно целевого элемента для appname.xcdatamodeld проверяется как для приложения и расширения. Как правильно распределить основные данные как для контейнерного приложения, так и для расширения?

ответ

13
lazy var persistentContainer: NSPersistentContainer = { 
    /* 
    The persistent container for the application. This implementation 
    creates and returns a container, having loaded the store for the 
    application to it. This property is optional since there are legitimate 
    error conditions that could cause the creation of the store to fail. 
    */ 
    let container = NSPersistentContainer(name: "xx") 

    let appName: String = "xx" 
    var persistentStoreDescriptions: NSPersistentStoreDescription 

    let storeUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.xx.xx.container")!.appendingPathComponent("xx.sqlite") 


    let description = NSPersistentStoreDescription() 
    description.shouldInferMappingModelAutomatically = true 
    description.shouldMigrateStoreAutomatically = true 
    description.url = storeUrl 

    container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.xxx.xx.container")!.appendingPathComponent("xx.sqlite"))] 

    container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
     if let error = error as NSError? { 
      fatalError("Unresolved error \(error), \(error.userInfo)") 
     } 
    }) 
    return container 
}() 
+0

По существу, что изменилось для Swift 3 является то, что вам нужно, чтобы указать на SecurityGroup в качестве вашего магазина URL, так что они оба существа сохраненный для этого. (Предположим, что вы уже правильно настроили группу приложений в части возможностей проекта) –

+0

Я сохранил постоянное хранилище (файл sqlite) в общем каталоге групп приложений, как указано выше. Однако я не могу понять, как получить доступ к постоянному хранилищу из расширения приложения. Весь код, который я нашел, использует делегат приложения (недоступный в расширении) из основного приложения, чтобы получить ManagedObjectContext. Может ли кто-нибудь сказать мне, как это сделать? –

-1

У расширения не будет доступа к тому же хранилищу данных, что и в главном приложении. Главное приложению нужно будет создать общее хранилище данных с NSUSerDeafults.initWithSuitName

NSUserDefaults * sharedUserDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"groupName"]; 

 Смежные вопросы

  • Нет связанных вопросов^_^