【发布时间】:2011-04-04 15:43:53
【问题描述】:
我创建了一个应用程序,数据存储在 plist 中。现在有什么方法可以更新数据?也许如果我创建一个网页并从中检索我的数据而不是存储在 plist 中?或者有什么方法可以在我插入 iTunes 时更新我的数据?或者有什么其他建议?我想要实现的是一种在用户下载应用程序后更新我的数据的方法。
【问题讨论】:
我创建了一个应用程序,数据存储在 plist 中。现在有什么方法可以更新数据?也许如果我创建一个网页并从中检索我的数据而不是存储在 plist 中?或者有什么方法可以在我插入 iTunes 时更新我的数据?或者有什么其他建议?我想要实现的是一种在用户下载应用程序后更新我的数据的方法。
【问题讨论】:
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir = [path objectAtIndex:0];
NSString *filePath = [dir stringByAppendingPathComponent:@"my.plist"];
NSMutableDictionary *localDictionary;
NSUrl *remoteUrl = [NSURL URLWithString:@"http://server.com/my.plist"];
NSMutableDictionary *remoteDictionary = [NSMutableDictionary dictionaryWithContentsOfURL:remoteUrl];
if(remoteDictionary != nil) {
[remoteDictionary writeToFile:filePath atomically:YES];
localDictionary = remoteDictionary;
}
else {
localDictionary = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
if(localDictionary == nil) localDictionary = [NSMutableDictionary dictionary];
}
这将尝试从http://server.com/ 获取my.plist 的副本,成功时会将其写入磁盘并将localDictionary 指向它,错误时它将尝试从磁盘读取(例如,较早下载时有一个连接),如果磁盘上没有文件,它将创建一个空的NSMutableDictionary。无论哪种方式,localDictionary 最终都会指向NSMutableDictionary。
这很简单,每次运行代码时都会请求文件。你可以例如使用NSFileModificationDate(由NSFileManger attributesOfItemAtPath:error: 获得)和NSDate 来确定是否需要更新。或者对于大文件版本控制也是有意义的,有一个包含大文件版本的小文件 - 从服务器获取小文件(例如使用NSString),检查缓存的版本文件是否包含较低的版本号,如果是这样,请获取大文件。它始终取决于内容的刷新频率。
查看完整文档:NSDictionary、NSString、NSFileManager、NSDate
【讨论】:
Plist 不容易修改,因为您必须将它们读回内存,进行更改并将它们写回文件。
要编写 plist,请查看 NSDictionary 或 NSArray 的 writeToFile:atomically: 方法。请记住,您的 plist 基本上是由 NSArrays、NSDictionaries、NSStrings 和 NSData 组成的 XML,并且您总是想写出根节点。
或者寻找其他存储数据的方法:用户默认值或 sqlite 数据库。仅在某些情况下,将数据“存储在云端”才有意义,例如,如果您想在不同设备之间共享数据或想远程更新数据。最好尽量避免。
【讨论】:
NSMutableDictionary 将数据版本或更新日期存储在 plist 中。