如何在核心数据中保存键值对?
How to save key value pairs in Core Data?
我正在构建一个允许用户命名颜色的应用程序。例如,用户可以将#00FFFF 命名为"green"。我需要将这些名称和相应的颜色存储在 Core Data 中。
我认为最好的方法是将这些对保存为键值对 - 颜色作为键,名称作为值。但是当我创建一个新实体并添加这两个属性时,我无法告诉 Core Data 颜色是 "primary key" 或其他东西。而且我不能告诉 Core Data 给我相应的名字。
我想到了一些解决方法,但它们还不够 "swifty"。
将键值对保存为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]
你需要使用 "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)
我正在构建一个允许用户命名颜色的应用程序。例如,用户可以将#00FFFF 命名为"green"。我需要将这些名称和相应的颜色存储在 Core Data 中。
我认为最好的方法是将这些对保存为键值对 - 颜色作为键,名称作为值。但是当我创建一个新实体并添加这两个属性时,我无法告诉 Core Data 颜色是 "primary key" 或其他东西。而且我不能告诉 Core Data 给我相应的名字。
我想到了一些解决方法,但它们还不够 "swifty"。
将键值对保存为
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]
你需要使用 "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)