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

How to save key value pairs in Core Data?

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

我认为最好的方法是将这些对保存为键值对 - 颜色作为键,名称作为值。但是当我创建一个新实体并添加这两个属性时,我无法告诉 Core Data 颜色是 "primary key" 或其他东西。而且我不能告诉 Core Data 给我相应的名字。

我想到了一些解决方法,但它们还不够 "swifty"。

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

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

像这样:

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

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

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

var theNameOfGreen = colorNameDictionary[0x00ff00]

你需要使用 "Relationships",我猜是一对一的。

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

然后创建第二个 "Colors" 实体并添加 1 个属性 "color"(例如)和 1 个关系 "name"(例如)。 并绑定他们。

如果我没理解错的话。

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)