我正在构建一个允许用户命名颜色的应用。例如,用户可以将#00FFFF命名为" green"。我需要在Core Data中存储这些名称和相应的颜色。
我认为最好的方法是将对保存为键值对 - 将颜色保存为键,将名称保存为值。但是当我创建一个新实体并添加了两个属性时,我没有办法告诉Core Data颜色是"主键"或者其他的东西。我无法告诉Core Data给我相应的名字。
我想到了一些解决方法,但它们并不是很好的"够了。
将键值对保存为NSUserDefaults
中的字典。但我只能在那里保存[String: AnyObject]
。我需要的是[Int: String]
。我知道我可以将int转换为字符串,但这只会使代码更难以理解且不易使用。另外,我需要将密钥的值从AnyObject
转换为String
,这是我不喜欢的另一件事。它就像仿制药一样没有被发明出来。
我可以在Core Data实体中保存颜色和名称。当我想找到相应的颜色名称时,我会对整个事物进行线性搜索。
像这样:
for item in allTheColorNames {
if item.color == theStuffIWantToFind {
// do something
break
}
}
我希望我能一气呵成。上面的代码不是很优雅,你知道我的意思吗?
有没有办法在Core Data中存储颜色名称对,以便我可以做这样的事情?
var theNameOfGreen = colorNameDictionary[0x00ff00]
答案 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个关系“名称”(例如)。 绑定他们。
如果我理解正确的话。