gpt4 book ai didi

swift - 初始化时内存中CoreData容器为空

转载 作者:行者123 更新时间:2023-12-02 09:07:16 27 4
gpt4 key购买 nike

tl;博士:

  1. 克隆项目:https://github.com/Jasperav/CoreDataInMemoryFail
  2. 运行测试并查看它是否失败。为什么我的内存容器没有任何数据?如何确保它有数据?

长:

我有一个包含填充数据的 sqlite 文件,并且在 CoreData 中有一个内存数据库。一些代码:

// ...
func createInMemoryPerformanceTestDatabase() -> NSPersistentContainer {
let url = createPathToSomeSQLiteFile()
let container = NSPersistentContainer(name: dataModelName, managedObjectModel: objectModel)
let description = NSPersistentStoreDescription(url: url)

description.type = NSInMemoryStoreType

container.persistentStoreDescriptions = [description]

container.loadPersistentStores { description, error in
XCTAssertNil(error)
}

return container
}
// ...

尽管 sqlite 文件内有数据,但我在使用 container 创建的上下文中看不到它。

当我使用 CoreData 创建内存数据库并指向包含数据的 sqlite 文件时,在查询数据库时看不到任何结果。我想查看 sqlite 文件内的数据。数据应该全部加载到内存中。这是出于测试目的。

最佳答案

您所尝试的问题是您在将 storeDescription 加载到容器之前将其类型设置为 NSInMemoryStoreType 。由于 storeDescription 的类型被声明为 NSInMemoryStoreType,因此 api 不会从您提供的文件 URL 中读取和填充数据。为了让 api 能够从文件 url 读取数据,storeDescription 的类型必须是通过初始化器 init(url: URL) 初始化定义的类型。在您的情况下,这是SQLite

但是,如果您希望拥有一个 NSInMemoryStoreType 类型的持久存储,其中包含从文件 url 读取的数据,您可以使用函数 migratePersistentStore:toURL:options:withType:error: 迁移 NSInMemoryStoreType 类型的持久容器的持久存储。 。您可以尝试下面的代码片段。

import CoreData
import XCTest
@testable import CoreDataInMemoryFail


class CoreDataInMemoryFailTests: XCTestCase {

private func createContainer(modify: (NSPersistentContainer) -> ()) -> NSPersistentContainer {
let bundle = Bundle(for: type(of: self))
let path = bundle.path(forResource: "InMemoryDatabase", ofType: "sqlite")!
let url = URL(fileURLWithPath: path)
let persistentContainer = createPersistentContainer(dataModelName: "InMemoryDatabase")
let storeDescription = NSPersistentStoreDescription(url: url)

persistentContainer.persistentStoreDescriptions = [storeDescription]
persistentContainer.loadPersistentStores { description, error in
XCTAssertEqual(storeDescription.type, description.type)
XCTAssertNil(error)
}

modify(persistentContainer)
return persistentContainer
}

func testFail() {
let persistentContainer = createContainer(modify: { _ in })
let inMemoryContainer = createContainer { persistentContainer in
let coordinator = persistentContainer.persistentStoreCoordinator
coordinator.persistentStores.forEach { (persistentStore) in
do {
try coordinator.migratePersistentStore(persistentStore, to: NSPersistentContainer.defaultDirectoryURL(), options: nil, withType: NSInMemoryStoreType)
} catch {
print("Error while migrating persistentStore")
}
}
}

let persistentContainerCoordinator = persistentContainer.persistentStoreCoordinator
persistentContainerCoordinator.persistentStores.forEach { (persistentStore) in
XCTAssertEqual(persistentStore.type, "SQLite")
}

let inMemoryContainerCoordinator = inMemoryContainer.persistentStoreCoordinator
inMemoryContainerCoordinator.persistentStores.forEach { (persistentStore) in
XCTAssertEqual(persistentStore.type, NSInMemoryStoreType)
}

let fetchRequest: NSFetchRequest<Person> = Person.fetchRequest()
let persistentContainerCount = (try! persistentContainer.viewContext.fetch(fetchRequest)).count
let inMemoryContainerCount = (try! inMemoryContainer.viewContext.fetch(fetchRequest)).count

XCTAssertEqual(8, persistentContainerCount)
XCTAssertEqual(persistentContainerCount, inMemoryContainerCount)
}

}

在上面的代码片段中,我还添加了断言来验证 persistenceStore 类型是否为 inMemoryContainer 中的 NSInMemoryStoreType 以及 SQLite 中的 >持久容器。希望对您有所帮助。

关于swift - 初始化时内存中CoreData容器为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58584486/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com