扩展中的CoreData:如何在共享组中使用数据库?

问题描述 投票:0回答:1

试图使用 CoreData 键盘扩展名中。我想那个数据库文件一定是在一个地方同时存在--扩展名和包含应用。那个地方就是应用组。我在苹果账户中创建了它。我在应用程序和扩展名中都设置了使用它(在唱歌和能力中的复选框)。但是在应用和扩展中是不一样的,或者是我误解了什么。这里有一些代码。

在我的应用程序中,我做了一个懒惰的变量来存储 DB 档案 URLAppDelegate 文件。

   lazy var secureAppGroupPersistentStoreURL : URL = {
       let fileManager = FileManager.default
       let groupDirectory = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.xxxxx")!
       //xxxxx - is my real bundle identificator
       return groupDirectory.appendingPathComponent("SharedData.sqlite")
    }()

我想它一定是指向共享文件夹中的文件。然后我创建了 PersistentContaner 这样

   lazy var testPersistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "testDataShare")
        let description = NSPersistentStoreDescription(url: secureAppGroupPersistentStoreURL)
        description.shouldInferMappingModelAutomatically = true
        description.shouldMigrateStoreAutomatically = true
        container.persistentStoreDescriptions = [description]

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

我使用 NSPersistentStoreDescription 来设置DB文件名。至少我相信它是这样工作的:)之后,在我的SceneDelegate文件中,我使用了这样的容器(我的测试实体叫做Entity,只有一个属性叫做name)。

//debug
    let testContext = (UIApplication.shared.delegate as! AppDelegate).testPersistentContainer.viewContext
    let fetchRequest: NSFetchRequest<Entity> = Entity.fetchRequest()
     if let keyboards = try? testContext.fetch(fetchRequest){
         print("fetch: \(keyboards.debugDescription)")
     }else{
         print("fetched nothin")
     }

    let testEntity = Entity(context: testContext)
    testEntity.name = "test from app"
    _ = try? testContext.save()

只是为了测试,我每次启动我的应用程序时都会多插入一个对象。目前工作正常。我在控制台得到的调试信息是这样的。

fetch: [(实体:实体;id:0x9f53fc35e433bbae ; 数据:),(实体:实体;id:0x9f53fc35e43fbbae ; 数据:),(实体:实体;id:0x9f53fc35e43bbbae ; 数据:),(实体:实体;id:0x9f53fc35e427bbae ; 数据。 )、(实体:实体;id:0x9f53fc35e423bbae ; 数据: )、(实体:实体;id:0x9f53fc35e42fbbae ; 数据: )、(实体:实体;id:0x9f53fc35e42bbbae ; 数据: { name = "test from app"; })] 。

我在我的扩展中也做了同样的事情,添加了懒惰的变种。secureAppGroupPersistentStoreURL创立 PersistentContainerKeyboardViewController 并试图在 viewDidLoad() 但它不显示任何结果。

override func viewDidLoad() {
    super.viewDidLoad()


    let context = self.testPersistentContainer.viewContext
    let fetchRequest: NSFetchRequest<Entity> = Entity.fetchRequest()
    if let keyboards = try? context.fetch(fetchRequest){
        print("fetch: \(keyboards.debugDescription)")
    }else{
        print("fetched nothin")
    }
    //...
}

当我启动扩展模拟时,它打印出这样的结果。

2020-03-06 01:17:25.835412+0300 Keyboard[3482:275851] Failed to inherit CoreMedia permissions from 3042: (null)fetch: []

我希望我保存在app中的对象能够在extension中获取,反之亦然。

我在数据库文件上做错了什么?

swift core-data bundle persistent-storage
1个回答
1
投票

确保你的键盘扩展名已启用完全访问。如果没有,我怕你不能访问共享数据,甚至保存到扩展和父应用程序之间的UserDefaults。

© www.soinside.com 2019 - 2024. All rights reserved.