如何保存和检索字典数组的数组
我有一个应用程序周围,需要坚持的字典数组的数组。 我不能将它保存到NSUserDefaults。 我可能会使用CoreData,如果我有它的经验,但它似乎矫枉过正,我只需要在启动时收集数据,并保存一次关闭。如何保存和检索字典数组的数组
所以我想弄清楚如何写这个保存到一个plist文件(如果可能的话)。 并在应用程序启动时检索它。
数据:
// Declare var
var recordingsDictionaryArray = [[:]]
// Populate many times during app use
recordingsDictionaryArray.insert(["name":saveRecordingField.stringValue, "date":NSDate(), "path":recorder.url], atIndex: 0)
所以词典包含字符串的NSDate的混合物,而NSURL
可这在我的applicationSupport文件被保存到一个plist文件..? 希望不会在启动时保存并重新构建它时将其分开。
我正在尝试一个例子,但我不能得到它的工作,如果我没有参考[0]的数据变种。如果我只是说VAR数据= recordingsDictionaryArray我得到的错误:
func applicationWillTerminate(aNotification: NSNotification) {
// add some dummy content to the empty recordingsDictionaryArray
recordingsDictionaryArray.insert(["name":"Recording One", "date":NSDate(), "path":"dummy path"], atIndex: 0) // dummy content
recordingsDictionaryArray.insert(["name":"Recording Two", "date":NSDate(), "path":"another dummy path"], atIndex: 0) // dummy content
recordingsDictionaryArray.insert(["name":"Recording Three", "date":NSDate(), "path":"final dummy path"], atIndex: 0) // dummy content
// check the count
var thecount = recordingsDictionaryArray.count
println(thecount)
var data = recordingsDictionaryArray[0] // if i do not add reference to item [0] data errors below
var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
var path = paths.stringByAppendingPathComponent("data.plist")
var fileManager = NSFileManager.defaultManager()
if (!(fileManager.fileExistsAtPath(path)))
{
var bundle: NSString = NSBundle.mainBundle().pathForResource("recordings", ofType: "plist")!
fileManager.copyItemAtPath(bundle, toPath: path, error:nil)
}
data.objectForKey(data)
data.writeToFile(path, atomically: true)
// I only get "Recording 3" saved to the plist
}
再回答下面的1: 我觉得我是接近NSUserDefaults的与到达那里,但不知道如何让mutableRetrievedDictionary回recordingsDictionaryArray为它是在保存之前。
// save
NSUserDefaults.standardUserDefaults().setObject(recordingsDictionaryArray, forKey: "recordingsArray")
NSUserDefaults.standardUserDefaults().synchronize()
// retrieve
var mutableRetrievedDictionary: AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("recordingsArray")?.mutableCopy()
您绝对可以将其保存到NSUserDefaults。 试试这个:
let standard = NSUserDefaults.standardUserDefaults() //Helps when you call it a lot
var recordingsDictionaryArray : NSMutableArray!
//SAVE
standard.setObject("anyObject", forKey: "myKey")
standard.synchronize()
//RETRIEVE
recordingsDictionaryArray = standard.objectForKey("myKey") as NSMutableArray
//Force the object called back to be mutable again
非常感谢您的支持,我认为我正在与NSUserDefaults进行一场失败的比赛。感觉我接近这样做,但不能完全胜任。请参阅我的问题底部的更新。谢谢。 – 2014-11-21 11:40:34
如果您正在回答问题,请考虑添加包含解决方案的实际代码。否则你的答案可能会被删除 – 2014-11-21 11:43:34
很多半受过教育的试错之后,我发现了一个解决方案,对我来说在这种情况下工作,使用NSUserDefaults的:
func applicationWillTerminate(aNotification: NSNotification) {
// add some dummy content to the empty recordingsDictionaryArray
recordingsDictionaryArray.insert(["name":"Recording One", "date":NSDate(), "path":"dummy path"], atIndex: 0) // dummy content
recordingsDictionaryArray.insert(["name":"Recording Two", "date":NSDate(), "path":"another dummy path"], atIndex: 0) // dummy content
recordingsDictionaryArray.insert(["name":"Recording Three", "date":NSDate(), "path":"final dummy path"], atIndex: 0) // dummy content
// Save to NSUserDefaults
NSUserDefaults.standardUserDefaults().setObject(recordingsDictionaryArray, forKey: "recordingsArray")
NSUserDefaults.standardUserDefaults().synchronize()
取回数据
func applicationDidFinishLaunching(aNotification: NSNotification) {
recordingsDictionaryArray = NSUserDefaults.standardUserDefaults().objectForKey("recordingsArray")?.mutableCopy() as Array
请注意,从NSUserDefaults返回的数据总是不可变的,需要再次更改为mutable。 – AMAN77 2014-11-21 15:07:04