将数据写入 .plist

Posted

技术标签:

【中文标题】将数据写入 .plist【英文标题】:Write data to .plist 【发布时间】:2012-09-16 12:25:32 【问题描述】:

我知道这个问题可能与许多以前提出的问题相似,但在阅读了所有这些问题和答案后,我无法理解该怎么做。

我想写一些带有wordNameswordDefinitions 的单词,还有一些带有IDdate ID 的单词。我有以下代码,但我有两个关于使用具有不同数据类型的数组的字典以及为字典定义键的方式的问题。

如果我制作的整个 .plist 文件有误,请纠正我。

提前致谢。

- (IBAction)addWord:(id)sender

NSString *destinationPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
destinationPath = [destinationPath stringByAppendingPathComponent:@"Box.plist"];

NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath:destinationPath]) 

    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"Box" ofType:@"plist"];
    [fileManager copyItemAtPath:sourcePath toPath:destinationPath error:nil];


// Load the Property List.  
NSMutableArray* wordsInTheBox = [[NSMutableArray alloc] initWithContentsOfFile:destinationPath];


NSString *wordName = word.name;
NSString *wordDefinition = word.definition;
NSInteger deckID;
NSDate addedDate;


//is this correct to have an array of different types?
NSArray *values = [[NSArray alloc] initWithObjects:wordName, wordDefinition, deckID, addedDate, nil]; 
//How and where am I supposed to define these keys?
NSArray *keys = [[NSArray alloc] initWithObjects: NAME_KEY, DEFINITION_KEY, DECK_ID_KEY, DATE_KEY, nil]; 
NSDictionary *dict = [[NSDictionary alloc] initWithObjects:values forKeys:keys];
[wordsInTheBox addObject:dict];
[wordsInTheBox writeToFile:destinationPath atomically:YES];

【问题讨论】:

【参考方案1】:

initWithContentsOfFile: 总是返回一个不可变数组。你应该这样做:

NSMutableArray *wordsInTheBox = [[NSMutableArray alloc] initWithArray:[NSArray arrayWithContentsOfFile:destinationPath]];

我不完全明白word 变量的定义位置。是 ivar 吗?

如果您使用的是最新版本的 Xcode(4.4 或 4.5),我建议您使用更简单的文字来创建字典。

NSDictionary *dict = @NAME_KEY       : wordName, 
                       DEFINITION_KEY : wordDefinition, 
                       DECK_ID_KEY    : deckID, 
                       DATE_KEY       : addedDate;

但是我也没有发现您的字典定义有问题。它应该可以工作。

您必须确保在某处定义了 NAME_KEY、DEFINITION_KEY 等。所有大写字母通常仅用于预处理器宏,因此您可以执行以下操作:

#define NAME_KEY @"Name"
#define DEFINITION_KEY @"Definition"

您也可以直接在字典中使用字符串:

NSDictionary *dict = @@"Name"       : wordName, 
                       @"Definition" : wordDefinition, 
                       @"DeckID"     : deckID, 
                       @"Date"       : addedDate;

但是使用宏也不是一个坏主意。

【讨论】:

非常感谢您的详细解答。我在一个单独的类中有一个 Word 对象及其属性和内容。我将尝试您很快提到的内容,并让您知道。附言我正在使用 Xcode 4.2.1。

以上是关于将数据写入 .plist的主要内容,如果未能解决你的问题,请参考以下文章

将 NSArray 写入 plist 文件

如何将这些数据写入我的 Plist? - 斯威夫特

在运行应用程序时将数据写入 plist 并将它们读取到 UITable

如何在 plist 中写入数据?

无法在 iOS 中将数据写入 .plist

如何成功写入plist?