【问题标题】:Shipping CoreData App with Populated Table使用填充表运送 CoreData 应用程序
【发布时间】:2021-05-30 15:25:03
【问题描述】:

我有一个 CoreData 应用程序,其中包含一个从文本文件填充的表。我有一个测试例程,可以从文本文件初始化表,但我更愿意使用已经存在的数据发送应用程序,并且不必进行初始化过程。

我怀疑我需要在应用程序中包含数据库表,但我不知道如何在填充它的情况下执行此操作。显然,那里有一张桌子,但是当应用程序在 TestFlight 中退出时(这就是我们现在所在的位置),这张桌子是空的。

避免此初始化过程并将应用程序与数据一起发送的最佳方法是什么?

【问题讨论】:

  • 请提供初始化持久存储的代码。

标签: ios swift core-data deployment


【解决方案1】:

假设您的意思是 Core Data 持久存储(Core Data 没有表),这是我过去使用的一种方法。

在您的应用程序中的模拟器(甚至设备上)中创建持久存储,使用您在测试时用来创建它的相同代码。在您的 Mac 上找到该文件,或从您的设备中提取它。您现在有一个(可能是 SQLite)文件,其中包含您的初始数据。

现在将该文件作为资源添加到您的 .xcodeproj 中。在构建应用时,您现在会将初始化数据作为捆绑包的一部分包含在内,并且可以在启动时搜索它。

这是静态商店的示例代码。如果您希望能够更新它,您将需要做更多工作来从静态存储初始化实时存储。

    let persistentContainer = NSPersistentContainer(name: "XYZZY")
    let storeURL = URL.init(fileURLWithPath: Bundle.main.path(forResource: "XYZZY", ofType: "sqlite")!)
    let psDescription = NSPersistentStoreDescription(url: storeURL)
    psDescription.setOption(true as NSObject, forKey: NSReadOnlyPersistentStoreOption)
    persistentContainer.persistentStoreDescriptions = [psDescription]
    persistentContainer.loadPersistentStores() { (description, error) in
        if let error = error {
            fatalError("Failed to load Core Data stack: \(error)")
        }
    }

如果文件很大,您可能希望在创建它时对其执行真空操作。此时,值得拥有一个单独的 Mac 程序来从您的文本文件创建初始持久存储。

这是一种从 Mac 导入器中查找 SQLite 文件的方法:

    if let cdFolder = self.importer.datastoreURL()?.path {
        print("open", cdFolder)
        NSWorkspace.shared.openFile(cdFolder)
    }

func datastoreURL() -> URL? {
    if let cdFolder = persistentContainer.persistentStoreDescriptions[0].url?.deletingLastPathComponent() {
        return cdFolder
    }
    return nil
}

这会在控制台上为您提供一行,您可以在终端中复制/粘贴。

【讨论】:

  • 谢谢,哈尔,我会试试看的。
  • 赞成或接受的答案比感谢评论更好。
  • 但在我验证了这个想法之前,我也不太可能这样做。仅供参考,我位于 S.E.亚洲,因此来自北美人的消息的 36 小时循环周期是常态。世界很大。
猜你喜欢
  • 2020-06-21
  • 2019-12-23
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 2011-11-03
相关资源
最近更新 更多