2012-07-26 42 views
0

我试图在plist中保存一些评论,这没关系,因为它只是一个原型。问题是我可以从plist读取,但是当我尝试写入和读取之后,它会抛出一个“数组越界”异常。我无法弄清楚我在这里做错了什么。如何在.plist中写入数据?

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Comments" ofType:@"plist"]; 
NSMutableArray *plistArray = [[NSMutableArray alloc] initWithContentsOfFile:filePath]; 


NSMutableDictionary *newComment = [NSMutableDictionary dictionary]; 
[newComment setValue:commentTitle.text forKey:@"title"]; 
[newComment setValue:comment forKey:@"comment"]; 


[plistArray addObject:newComment]; 
[plistArray writeToFile:filePath atomically:NO]; 

这工作正常,然后我尝试阅读:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Comments" ofType:@"plist"]; 
NSMutableArray *plistArray = [[NSMutableArray alloc] initWithContentsOfFile:filePath]; 


NSMutableDictionary *dictionary = (NSMutableDictionary *) [plistArray objectAtIndex:0]; 

NSLog(@"%@", [dictionary objectForKey:@"title"]); 

它抛出异常。

如果我手动添加项目到plist,它工作正常,我想这意味着我的阅读代码很好。

难道是我的plist的结构吗?

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<array> 
</array> 
</plist> 

*终止应用程序由于未捕获的异常 'NSRangeException',原因: ' - [__ NSCFArray objectAtIndex:]:索引(1)超过界限(1)'

我添加了 “说明”在写入plist之前写入数组。如果我使用下面的代码:

NSString *aDocumentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
// NSString *aFilePath = [NSString stringWithFormat:@"%@/Comments.plist", aDocumentsDirectory]; 
// 
// NSMutableArray *plistArray = [[NSMutableArray alloc] initWithContentsOfFile:aFilePath]; 

回报是(空)

但是如果我使用:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Comments" ofType:@"plist"]; 
NSMutableArray *plistArray = [[NSMutableArray alloc] initWithContentsOfFile:filePath]; 

我可以看到数组的内容以及它的所有工作正常。

问题是:在两种方式我不能写入文件,它不断返回“否”。而且我已经检查的权限

+0

发生异常时发送堆栈跟踪。 – trojanfoe 2012-07-26 11:55:54

+0

@trojanfoe发布 – 2012-07-26 12:17:48

+0

这不是一个堆栈跟踪。一个stacktrace可以让你看到你的代码在崩溃的时候在哪里。 – trojanfoe 2012-07-26 12:21:41

回答

-2

如果你只把一个项目在数组中,读取的时候,你显然应该使用索引0而不是1:

NSMutableDictionary *dictionary = (NSMutableDictionary *) [plistArray objectAtIndex:0]; 
+0

不是这样。我只是改变了“0”为“1”原因我手动添加一个项目,以检查是否阅读代码工作正常 – 2012-07-26 12:16:59

0

我看到两个问题与您的代码:

  1. (可能或不是问题)。如果文件最初不存在,则initWithContentsOfFile:选择器将返回nil,导致其余代码为空操作。

  2. (可能是原因)。你可以而不是写入bundle资源目录。改为将文件存储在Documents或Caches目录中。

要找到你的文档目录,使用这样的:

- (NSString*) pathForDocument:(NSString*)documentName { 
    NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    if(documentDirectories.count < 1) return nil; 
    return [[documentDirectories objectAtIndex:0] stringByAppendingPathComponent:documentName]; 
} 
+0

1它不是原因,我可以从文件中读取,如果我手动插入项目。 – 2012-07-26 12:19:56

+0

我没有得到第二种方式。我使用此代码来获取文档目录的路径,然后使用[plistArray writeToFile:]作为该目录? – 2012-07-26 12:20:47

+0

您可以写入文件,而不是目录。例如'[plistArray writeToFile:[self pathForDocument:@“someFile.plist”] atomically:NO];' – Krumelur 2012-07-26 12:53:56

0

首先,为什么你写一个文件到你的包吗?

然后,为了解决您的问题,请检查您是否真的写过文件。

if ([plistArray writeToFile:filePath atomically:NO]) 
    NSLog (@"Written"); 
else 
    NSLog (@"Not Written"); 

此外,登录你的阵列,当你使用-(void)description检查字典的内容阅读。

编辑

正如你说,你不写你的plist。现在,只需在桌面上创建一个测试plist。

NSString *testPath = [[NSString stringWithString:@"~/Desktop/Comments.plist"] stringByExpandingTildeInPath]; 
if ([plistArray writeToFile:testPath atomically:NO]) 
    NSLog (@"Written"); 
else 
    NSLog (@"Not Written");  

如果仍然返回Not Written,那么您的字典出现问题。我怀疑这是因为它只是字符串(尽管它们可能是占位符,用于在stackoverflow上提出问题。文档指出,字典中的类必须是NSData,NSDate,NSNumber,NSString,NSArray或NSDictionary)。如果这说的虽然写,但我猜它不会写入你的包由于权限,然后你必须改变你的plist位置到别的地方,而不是你的包,我推荐高度

+0

好吧,我们现在走在正确的道路上。回报是“不写”,但为什么? – 2012-07-26 12:16:07

+0

它没有被写入:/ – 2012-07-26 13:01:10

+0

在写入之前调用数组中的'description'。里面有什么? – TheAmateurProgrammer 2012-07-26 13:02:46

3

您正在尝试将文件写入mainBundle。绝对不可能。 您将必须编写plist文件到文档应用程序支持文件夹的应用程序。

在Documents目录中创建文件路径:

NSString *aDocumentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 

NSString *aFilePath = [NSString stringWithFormat:@"%@/Comments.plist", aDocumentsDirectory]; 

写入文件路径阅读

[plistArray writeToFile:aFilePath atomically:YES]; 

从文件路径

NSMutableArray *plistArray = [[NSMutableArray alloc] initWithContentsOfFile:aFilePath]; 
+0

我们很近。我改变了代码,但我仍然无法写入文件,它返回NO。有什么问题?? – 2012-07-26 12:49:51

+0

您正在“词典”中保存2个值。一个是'commentTitle.text',我认为它是NSString。什么是“评论”? – Roshit 2012-07-26 12:53:20

+0

快速重复。您将从保存在MainBundle中的Plist文件开始。你真的需要它吗?当你启动应用程序时,它是否有一些你想要使用的价值。如果不是,请丢弃评论。mainBundle的plist,并开始使用新的NSMutableArray。 – Roshit 2012-07-26 12:57:45