gpt4 book ai didi

swift - 使用 Swift 将数据分别加载到两个具有关系的 Core Data 实体中

转载 作者:行者123 更新时间:2023-11-30 10:42:31 25 4
gpt4 key购买 nike

我在应用程序启动时将数据加载到两个核心数据实体中。加载普通属性没有问题,但我不知道如何在 Swift 5 中设置关系。

在这两个相关实体中,CellData 与 Selector 具有单一的“一对一”关系(每个 Selector 行可以有许多 CellData 行)。

enter image description here

我的单个模型类加载两个实体的数据...

class LoadData
{
init ()
{

使用for循环,首先为选择器定义选择器实体数据...

    for count in 0...3
{
var text = "Value not found"
...

switch count
{
case 0:
text = "Masculine"
case 1:
text = "Neutral"
case 2:
text = "Feminine"
case 3:
text = "Plural"
default:
text = "Value unassigned"
}

...然后调用一个方法(如下)将数据添加到实体“Selector”。

        loadSelector(text: text, sortOrder: sortOrder, ...)
}

...在同一个 init 中,还有第二个 for 循环来定义 CellData

    for count in 0...51
{
var text = "Cell text not found"
var sortOrder: Int32 = 0
...

sortOrder = Int32(count)
...
switch count
{
case 0:
text = "Blank"
color1 = subject
colorRangeLoc1 = 0
colorRangeLen1 = Int32(text.count)
...
case 8:
text = "Der Mann"
color1 = article
...

case 9:
text = "Die Frau"
color1 = article
color2 = subject
colorRangeLoc1 = 0
colorRangeLoc2 = 4
colorRangeLen1 = 3
colorRangeLen2 = 4
underlineRangeLoc1 = 1
underlineRangeLen1 = 2
...

...还将每个循环中的数据传递到加载方法中。

           loadCellData(text: text, ...)
}
}

func loadSelector(text: String, sortOrder: Int32, color1: String?, color2: String?, color3: String?, colorRangeLoc1: Int32?, colorRangeLen1: Int32?, colorRangeLoc2: Int32?, colorRangeLen2: Int32?, colorRangeLoc3: Int32?, colorRangeLen3: Int32?)
{
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext

let entry: Selector = NSEntityDescription.insertNewObject(forEntityName: "Selector", into: context) as! Selector

entry.text = text
entry.sortOrder = sortOrder

do { try context.save() }
catch let error as NSError
{ print("Could not save. \(error), \(error.userInfo)") }
}

这可能不是最好的方法,但我正在努力通过 plist 加载数据。

我不明白的是如何在 CellData 中创建关系。例如,案例 8 需要与选择器数据建立关系,其中 .text = 'Masculine',而案例 9 中的 CellData 应与选择器条目 .text = 'Feminine' 相关。

我是否应该在第二个 for 循环之前或之内重新获取选择器条目,然后在每种情况下进行分配?我已经尝试过这个,但没有成功 - 如果可能,请显示代码以及代码需要在哪里。大多数信息似乎都在 Obj-c 中。 Swift 5 会很棒!

最佳答案

将它们视为普通对象,Core Data 会为您处理许多神奇的东西。

我将创建一个方法来创建所有选择器并将它们作为字典返回,以名称作为键(或任何其他适合您的集合)

func createSelectors(text: String) -> [String: Select] {
var result = [String: Selector]()
//loop creating Selector
result[text: entity]
return result
}

您甚至可以跳过 loadSelector 方法并执行实际实例化

let entity = Selector(context: context)

在 createSelectors 方法中和 try context.save() 可以在最后完成,而不是针对每个对象。请注意,像这样添加创建对象会将其放入 NSManagedObjectContext 中,这足以让现在能够使用这些对象,实际上可以在加载最后完成一次保存。

现在,在创建 CellData 时,您可以执行类似的操作

let selectors = createSelectors()
...
let cellData = CellData(context: context)
if let sel = selectors {
cellData.selectorToData = sel
}
....

一旦创建了所有 CellData 实体,您就可以调用 try context.save()

上面所有代码中的

context 是您通过这种方式获得的托管对象,`let context = appDelegate.persistentContainer.viewContext,但您可能已经得到了。

“Selector”在 Swift 中是一个特殊的名称,因为它是一个内置结构,我会认真考虑更改该实体的名称。

关于swift - 使用 Swift 将数据分别加载到两个具有关系的 Core Data 实体中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56479912/

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