iOS:plist数据不持久/找不到文件

时间:2012-08-23 20:41:37

标签: objective-c ios plist data-storage

我已经对其他有类似问题的人做过相当多的研究,为他们提供的解决方案未能解决我的问题所以我认为它显然缺少某些东西,或者我正在验证错误和不恰当的尝试识别我的错误。

我的问题是,当我尝试以编程方式保存/加载时,我为我的应用程序添加了持久数据存储而添加的.plist文件。

我有:

  • 验证它列在我项目的Build Phases选项卡中的“Copy Bundle Resources”下。
  • 验证该文件正被复制到我的/ Users / Me / Library / Application Support / iPhone Simulator / 5.1 / Applications / Unique App ID / myapp.app文件夹,如果已删除并重新运行,则会再次出现。
  • 清理并重建了我的项目

我的代码是有条理的,以便在两个不同的位置进行保存和加载。启动模态视图并且用户能够选择各种数据集时会发生加载。保存在应用程序委托- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions函数中。我已经验证了这两个函数都被调用了,虽然这种行为让我完全陷入困境。

根据开发人员资源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%的相同代码,并且它没有问题。

任何人都可以给予任何帮助将非常感激。在这一点上,我已经尝试了我能想到的一切,然后是一些。

1 个答案:

答案 0 :(得分:0)

applicationDidEnterBackground中,如果Documents目录中没有plist文件,则将plistPath设置为主包内的路径。然后你使用相同的路径来编写plist文件。换句话说,您尝试将字典写入应用程序主包中的plist文件。

仅在loadRecordsFromPList中首先查看Documents文件夹然后在主包中查找是有意义的。保存数据时,必须始终保存到Documents文件夹。