我正在建立一个超级简单的应用程序,只是为了练习,我似乎无法在应用程序启动时加载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数据。 我已经在这方面工作了一段时间,似乎无法取得任何进展。
谢谢!
答案 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
}
您可能还想检查它实际上是一个数组而不是字典。