Plist没有加载?

时间:2013-10-13 15:48:17

标签: ios objective-c

我正在建立一个超级简单的应用程序,只是为了练习,我似乎无法在应用程序启动时加载plist文件。我正在使用实用程序应用程序模板,下面是我的一些代码。

这是我尝试加载数据的地方,如果没有plist的路径,那么创建一个:

-(void) loadData
{
// load data here
NSString *dataPath = [self getFilePath];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:dataPath];

NSLog(@"Does the file exist? %i", fileExists);
// if there is data saved load it into the person array, if not let's create the array to use
if (fileExists) {
    NSLog(@"There is already and array so lets use that one");
    personArray= [[NSMutableArray alloc] initWithContentsOfFile:dataPath];
    NSLog(@"The number of items in the personArray %i", personArray.count);
    arrayNumber.text = [NSString stringWithFormat:@"%i",personArray.count];
}
else
{
    NSLog(@"There is no array so lets create one");
    personArray = [[NSMutableArray alloc]init];
    arrayNumber.text = [NSString stringWithFormat:@"%i",personArray.count];
}
}

这是我有一个可变数组然后尝试将其添加到plist的地方。     //将person对象添加到数组中         [personArray addObject:personObject];

    for (Person *obj in personArray)
    {
        NSLog(@"obj: %@", obj);
        NSLog(@"obj.firstName: %@", obj.firstName);
        NSLog(@"obj.lastName: %@", obj.lastName);
        NSLog(@"obj.email: %@", obj.email);
    }


    // check the count of the array to make sure it was added
    NSLog(@"Count of the personArray is %i", personArray.count);
    arrayNumber.text = [NSString stringWithFormat:@"%i",personArray.count];

    // check to see if the object was added
    NSLog(@"The number of items in the personArray %i", personArray.count);
    [personArray writeToFile:[self getFilePath] atomically:YES];

一切似乎都有效,我可以在我的数组中记录数据以确保它在那里,但是当我重新启动应用程序时,它永远不会拉入plist数据。 我已经在这方面工作了一段时间,似乎无法取得任何进展。

谢谢!

1 个答案:

答案 0 :(得分:0)

您的问题是initWithContentsOfFile:方法。

这将读取已打印到文件的数组表示。这可能比jml的[1,2,3]更接近于xml plist格式。您需要做的是将数据读入nsdata对象并对其进行反序列化。将数据以可以后读的格式保存到文件的过程称为序列化。从文件中读取序列化数据的过程称为反序列化。

回到答案:首先从文件中读取数据

NSData * fileData = [[NSData alloc] initWithContentsOfFile:dataPath];

现在你需要反序列化它

NSError * __autoreleasing error = nil; //drop the autoreleasing if non-ARC
NSPropertyListFormat format = NSPropertyListXMLFormat_v1_0;
id array = [NSPropertyListSerialization propertyListWithData: fileData 
                                                     options:kCFPropertyListImmutable
                                                      format:&format 
                                                       error:&error];
if(error) {
       //don't ignore errors
}

您可能还想检查它实际上是一个数组而不是字典。