Shipping CoreData应用程序与填充表



我有一个CoreData应用程序,其中包含一个从文本文件填充的表。我在测试中有一个例程,从文本文件初始化表,但我更愿意在数据已经到位的情况下发布应用程序,而不是初始化过程必须发生。

我怀疑我需要包含数据库表与应用程序,但我不知道如何做到这一点与它填充。显然,那里有一个表,但当应用程序在TestFlight中运行时(这就是我们现在的位置),表是空的。

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

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

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

现在将该文件作为资源添加到.xcodeproj中。当你构建你的应用程序时,你现在会把这些初始化数据作为bundle的一部分,并且可以在启动时搜索它。

下面是静态存储的示例代码。如果您希望能够更新它,您将有更多的工作要做,从静态存储初始化活动存储。
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
}

,它在控制台上给你一行,你可以复制/粘贴到终端。

最新更新