plist作为持久存储,用于在关闭和重新启动应用程序之间存储和检索数据

时间:2010-11-16 17:57:03

标签: iphone plist

我试图在用户第一次启动应用程序时将少量属性保存到plist中,然后当用户重新启动应用程序时,我必须检索这些数据并将其显示给用户,这样我就不会不得不再次要求相同的数据。

我猜这应该是非常直接的,但可能是我错过了一些东西。

如果有人能指出我做同样事情的示例代码,那将是很好的,如果代码保存并从字典中检索数据到plist以及从plist到字典,那将会很好。

我查看了Apple Property List Programming指南,并使用了阅读和写入属性列表数据中的代码

http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/PropertyLists/ReadWritePlistData/ReadWritePlistData.html#//apple_ref/doc/uid/10000048i-CH8-SW1

但是,当我重新启动我的应用程序时,我没有收回我存储的数据。

*的 修改 *

我正在添加一些代码,以便有人可以指出我是否犯了任何错误。

我在项目资源文件夹中创建了一个plist文件“Data.plist”。

这就是我在一个视图控制器中保存数据的方法

    NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"Data.plist"];
//NSString *error;

NSMutableDictionary *dict = [NSMutableDictionary dictionary];


[dict setObject:@"xxxxxx" forKey:@"phoneNumber"];
[dict setObject:@"password" forKey:@"password"];
[dict setObject:@"email" forKey:@"email"];

[dict writeToFile:finalPath atomically:NO];

这就是我在同一个视图控制器viewDidLoad方法上读取数据的方法,因为我想从下次应用程序启动时加载数据。

    NSDictionary *dictionary;

// read "Data.plist" from application bundle
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"Data.plist"];
dictionary = [NSDictionary dictionaryWithContentsOfFile:finalPath];

// dump the contents of the dictionary to the console
for (id key in dictionary) {
    NSLog(@"bundle: key=%@, value=%@", key, [dictionary objectForKey:key]);
}   

在保存到文件之前,我可以在gdb上执行“po dict”,并且可以看到文件中有数据

NSLog打印错误

断言失败:(cls),函数getName,文件/SourceCache/objc4_Sim/objc4-427.1.1/runtime/objc-runtime-new.m,第3939行。

因为当我加载数据并在gdb上执行“po dictionary”时它是空的

1 个答案:

答案 0 :(得分:0)

-[NSDictionary writeToFile:atomically:]会返回YESNO,具体取决于是否成功。你在检查返回值吗?

如果我不得不猜测,我会说这是因为您正在将文件写入应用程序包中。你应该把它写在文件系统的其他地方; ~/Library/Application Support/<application name>是通常的位置。

修改

您可以使用以下内容检查返回值:

BOOL success = [dict writeToFile:finalPath atomically:YES];
if (!success) {
    NSLog(@"Could not write file");
}