【问题标题】:How to save key value pairs in Core Data?如何在 Core Data 中保存键值对?
【发布时间】:2016-08-05 11:48:05
【问题描述】:

我正在构建一个允许用户命名颜色的应用程序。例如,用户可以将#00FFFF 命名为“green”。我需要将这些名称和相应的颜色存储在 Core Data 中。

我认为最好的方法是将这些对保存为键值对 - 颜色作为键,名称作为值。但是当我创建一个新实体并添加两个属性时,我没有办法告诉 Core Data 颜色是“主键”什么的。而且我不能告诉 Core Data 给我相应的名字。

我已经想到了一些解决方法,但它们还不够“迅速”。

  1. 将键值对保存为NSUserDefaults 中的字典。但我只能在那里保存[String: AnyObject]。我需要的是[Int: String]。我知道我可以将整数转换为字符串,但这只会使代码更加不可读和不迅速。另外,我需要将键的值从AnyObject 转换为String,这是我不喜欢的另一件事。就像没有发明泛型一样。

  2. 我可以将颜色和名称保存在 Core Data 实体中。当我想找到一种颜色的对应名称时,我会线性搜索整个事物。

像这样:

for item in allTheColorNames {
    if item.color == theStuffIWantToFind {
        // do something
        break
    }
}

我希望我能一口气完成。上面的代码不是很优雅,你懂我的意思吗?

有没有办法将颜色名称对存储在 Core Data 中,以便我可以做这样的事情?

var theNameOfGreen = colorNameDictionary[0x00ff00]

【问题讨论】:

    标签: ios swift core-data keyvaluepair


    【解决方案1】:

    你需要使用“关系”,我猜是一对一的。

    创建一个新实体“NamesForColors”并添加1个属性“name”(例如)和1个关系“color”(例如)。

    然后创建第二个“颜色”实体并添加 1 个属性“颜色”(例如)和 1 个关系“名称”(例如)。 并绑定它们。

    如果我理解正确的话。

    【讨论】:

    • 核心数据没有像“主键”这样的概念。只有 NSManagedObjectID 作为唯一的 id。
    【解决方案2】:

    Dmytro 建议的应该是在 Core Data 中执行此操作的正确方法。 我会争辩说,它会为可能非常容易的事情带来很多开销。为什么不将其保存在属性列表中?只需在 Xcode 中创建一个,添加一个字典,并将名称作为键,并将相应的颜色作为值。

    从 plist 文件加载字典:

    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
    let documentsDirectory = paths.objectAtIndex(0)as NSString
    let path = documentsDirectory.stringByAppendingPathComponent("MyFile.plist")
    
    let fileManager = NSFileManager.defaultManager()
    
    // Check if file exists
    if(!fileManager.fileExistsAtPath(path))
    {
        // If it doesn't, copy it from the default file in the Resources folder
        let bundle = NSBundle.mainBundle().pathForResource("DefaultFile", ofType: "plist")
        fileManager.copyItemAtPath(bundle, toPath: path, error:nil)
    }
    
    var data = NSMutableArray(contentsOfFile: path)
    

    要将字典保存到 plist 文件中:

    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
    let documentsDirectory = paths.objectAtIndex(0) as NSString
    let path = documentsDirectory.stringByAppendingPathComponent("MyFile.plist")
    
    data.writeToFile(path, atomically: true)
    

    【讨论】:

    • 嗯...在这种情况下使用 plist 似乎是个好主意。但我不太明白你的代码。但无论如何,谢谢你的想法!我会在 plist 上做更多的研究!
    • 我刚刚注意到我切换了加载和保存。其实很简单。您将字典作为 plist 保存在 documentDirectory 中。在启动您的应用程序时或在您需要时加载数据。当您的应用程序关闭时,您可以从字典中写入此文件。一半的代码涉及文件路径的正确设置:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多