从核心数据中检索类型为 [String] 的 Transformable

Retrieving Transformable of type [String] from Core Data

提问人:Jessica Kimble 提问时间:11/16/2023 最后编辑:koenJessica Kimble 更新时间:11/16/2023 访问量:41

问:

“我的核心数据”属性设置为“可转换”,并在模型检查器中将自定义类设置为[String]

我能够像这样保存数据:

func saveResultsObjects(results: [String]) {
    let entity   = NSEntityDescription.entity(forEntityName: "ResultsObjects", in: context)
    let result = NSManagedObject(entity: entity!, insertInto: privateContext)
        
    result.setValue(results, forKey: "results")
        
    do {
        try privateContext.save()
        print("Success Saving In CoreData!")
    } catch {
        print("Failed Saving In CoreData!")
    }
}

并尝试以这种方式检索:

    func getResultsObjects() -> [String] {
        var retrievedResults = [String]()
        
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "ResultsObjects")
        let result = try? privateContext.fetch(fetchRequest)
        for data in result as! [NSManagedObject] {
            
            let results = data.value(forKey: "results") as? [String]
            
//            retrievedResults.append(results)
            retrievedResults[0] = "\(String(describing: results))"
        }
        return retrievedResults
    }

但是在尝试检索索引超出范围时崩溃retrievedResults[0]

我只保存数据。我做错了什么?[String]HTML

iOS Swift 核心数据

评论


答:

0赞 Jessica Kimble 11/16/2023 #1

它是通过创建一个空的 String 数组并在不指定索引的情况下将获取的数据附加到其中来解决的

func getResultsObjects() -> [String]? {
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "ResultsObjects")
    request.returnsObjectsAsFaults = false
    
    var retrievedResults = [String]()
    
    do {
        let result = try privateContext.fetch(request)
        
        for data in result as! [NSManagedObject] {
            
            guard let results = data.value(forKey: "results") as? [String] else { return nil }
            retrievedResults = results
            
        }
        return retrievedResults
        
    } catch {
        print("Getting Data failed!")
    }
    return nil
}

评论

1赞 MartinM 11/16/2023
我不确定您的预期行为是什么,但这仅从上次获取的项中检索 results 属性,因为尽管您获取了 ResultsObject 的所有实体,但您没有附加任何内容。