如何在核心数据中保存键值对?

时间:2016-04-14 05:15:48

标签: ios swift core-data keyvaluepair

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

我认为最好的方法是将对保存为键值对 - 将颜色保存为键,将名称保存为值。但是当我创建一个新实体并添加了两个属性时,我没有办法告诉Core Data颜色是"主键"或者其他的东西。我无法告诉Core Data给我相应的名字。

我想到了一些解决方法,但它们并不是很好的"够了。

  1. 将键值对保存为NSUserDefaults中的字典。但我只能在那里保存[String: AnyObject]。我需要的是[Int: String]。我知道我可以将int转换为字符串,但这只会使代码更难以理解且不易使用。另外,我需要将密钥的值从AnyObject转换为String,这是我不喜欢的另一件事。它就像仿制药一样没有被发明出来。

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

  3. 像这样:

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

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

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

    var theNameOfGreen = colorNameDictionary[0x00ff00]
    

2 个答案:

答案 0 :(得分:1)

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

从plist文件加载字典:

.titled-pane > .title{
   -fx-padding: 0 0 0 -4;
}

要将字典保存到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)

答案 1 :(得分:-1)

你需要一对一地使用“关系”。

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

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

如果我理解正确的话。