Objective c iOS:plist数据不持久/查找文件有问题

Objective c iOS:plist数据不持久/查找文件有问题,objective-c,ios,plist,data-storage,Objective C,Ios,Plist,Data Storage,我已经对其他有类似问题的人做了很多研究,为他们提供的解决方案未能解决我的问题,所以我认为这是明显缺失的东西,或者我正在错误地验证某些东西,试图识别我的错误 我的问题是,当我试图以编程方式保存/加载应用程序时,没有找到为应用程序提供持久数据存储而添加的.plist文件 我有: 已验证它是否列在我的项目的“构建阶段”选项卡的“复制捆绑资源”下 已验证文件是否正在复制到my/Users/Me/Library/Application Support/iPhone Simulator/5.1/Appli

我已经对其他有类似问题的人做了很多研究,为他们提供的解决方案未能解决我的问题,所以我认为这是明显缺失的东西,或者我正在错误地验证某些东西,试图识别我的错误

我的问题是,当我试图以编程方式保存/加载应用程序时,没有找到为应用程序提供持久数据存储而添加的.plist文件

我有:

  • 已验证它是否列在我的项目的“构建阶段”选项卡的“复制捆绑资源”下
  • 已验证文件是否正在复制到my/Users/Me/Library/Application Support/iPhone Simulator/5.1/Applications/Unique App ID/myapp.App文件夹,如果删除并重新运行,则会再次显示该文件
  • 清理并重建了我的项目
我的代码是这样组织的:保存和加载在两个不同的位置进行。当调出模式视图并且用户能够选择各种数据集时,就会发生加载。保存发生在应用程序委托
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项
函数中。我已经验证了这两个函数都被调用了,尽管这个行为让我完全困惑

相当样板的保存和加载代码主要基于开发者资源plist文章:

- (void)applicationDidEnterBackground:(UIApplication *)application
{    
    NSDictionary *someDataToSave = [NSDictionary dictionaryWithObject:self.viewController.dataStorage forKey:@"myData"];

    NSString *error;
    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *plistPath = [rootPath stringByAppendingPathComponent:@"someData.plist"];
    plistPath = [rootPath stringByAppendingPathComponent:@"someData.plist"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) {
        plistPath = [[NSBundle mainBundle] pathForResource:@"someData.plist" ofType:@"plist"];
    }

    NSString *generatedName = [NSString stringWithFormat:@"DataSet - %s", [NSDate date]];

    NSDictionary *plistDict = [NSDictionary dictionaryWithObject:someDataToSave forKey:generatedName];
    NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

    if(plistData)
        [plistData writeToFile:plistPath atomically:YES];
    else {
        NSLog(error);
    }
}

-(void)loadRecordsFromPList
{

    NSString *errorDesc = nil;
    NSPropertyListFormat format;
    NSString *plistPath;
    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    plistPath = [rootPath stringByAppendingPathComponent:@"someData.plist"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) {
        plistPath = [[NSBundle mainBundle] pathForResource:@"someData.plist" ofType:@"plist"];
    }

    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
    NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];

    if (!temp) {
        NSLog(@"Error reading plist: %@, format: %d", errorDesc, format);
    }

    self.myRecordsList = [NSMutableDictionary dictionaryWithDictionary:temp];    
}
我花了数小时在调试器中尝试各种事情,但我所做的任何调整都没有让我取得任何进展。fileExistsAtPath无明显原因始终返回null,尽管我在文件夹中看到了该文件,但仍然找不到该文件。此外,我还创建了一个只包含一个plist文件的单视图应用程序,以及一个视图控制器,其中我使用了与上面相同的99%的代码,它可以正常工作


任何人能给予的任何帮助都将不胜感激。此时,我已经尝试了我能想到的一切,然后尝试了一些。

ApplicationIdentinterBackground
中,如果Documents目录中没有plist文件,您可以将
plistPath
设置为主捆绑包中的路径。然后使用相同的路径写入plist文件。换句话说,您尝试将字典写入应用程序主捆绑包中的plist文件


只有在
loadRecordsFromPList
中,才有必要先查看文档文件夹,然后再查看主捆绑包。保存数据时,必须始终保存到Documents文件夹。

好吧,这是有道理的,现在回想起来,我不确定数据是如何进入的,它不相信Apple Dev网站上提供的示例。我现在遇到的问题是,当我尝试序列化dictionary对象时,dataFromPropertyList:format:errorDescription:返回nil。我递给它的字典是有效的,不是零。知道为什么会发生这种情况吗?代码中还有一个错误:当您创建
generatedName
时,您使用“%s”作为格式,但格式应该是“%@”——
dataFromPropertyList:…
失败后,
error
的值是多少?可能是您的字典包含NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary以外的对象吗?这是一个很好的问题,我想知道为什么该键被乱码了,但由于任何错误导致我的NSData被初始化为零而将其注销。错误为“属性列表的格式无效(属性列表不能包含“CFType”类型的对象”)。我想这可能是因为我在讲一系列的点的故事,这些点都是NSValues?我想我必须研究另一种方法。@KarolyS:
dataFromPropertyList:…
仅适用于NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary,根据文档说明。因此,必须对点使用不同的表示。