Плист не сохраняется из словаря (в Документы) - PullRequest
2 голосов
/ 22 января 2010

Я пытался сохранить список NSDictionary в папке документов моего приложения. Я еще не пробовал это на устройстве, но я хотел бы, чтобы он работал на симуляторе в целях тестирования. Метод [self createDictionaryFromChoreList] просто создает NSDictionary из некоторых данных в моем другом классе. Я в значительной степени скопировал / вставил этот код из веб-документов, и когда я смотрю, был ли файл сохранен или нет, я обнаруживаю, что это не так. Вот метод блока.

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *plistName = [[NSString alloc] initWithFormat:@"%@chores.plist", self.firstName];
NSString *path = [documentsDirectory stringByAppendingPathComponent:plistName];

NSDictionary *choresDictionary = [[NSDictionary alloc] initWithDictionary:[self createDictionaryFromChoreList]];
[choresDictionary writeToFile:path atomically:YES];

Любая помощь очень ценится. Заранее спасибо.

-S

Ответы [ 7 ]

5 голосов
/ 22 января 2010

Вы также должны захватить BOOL, возвращенную writeToFile:atomically:. Это скажет вам, если запись удалась или нет.

Кроме того, вы уверены, что ищете нужную папку с документами? Если у вас в симуляторе более одного приложения, легко открыть папку документов не того приложения в Finder. Я сделал это один раз, и это стоило мне пару часов разочарования.

Edit01:

writeToFile:atomically: возвращение false объясняет, почему файла не существует. Самое простое объяснение состоит в том, что что-то в словаре не является объектом списка свойств.

Из документов NSDictionary:

Этот метод рекурсивно проверяет, что все содержащиеся объекты являются собственностью список объектов (экземпляры NSData, NSDate, NSNumber, NSString, NSArray, или NSDictionary) перед записью файл, и возвращает НЕТ, если все объекты не являются объектами списка свойств, поскольку результирующий файл не будет действительный список свойств.

Требуется только один объект, не являющийся списком, скрытый глубоко в словаре, чтобы предотвратить его преобразование в список.

1 голос
/ 22 января 2010

Не забудьте сериализовать данные plist:

Вот фрагмент кода, который я использую для записи информации в список

NSString *errorString;

NSData *data = [NSPropertyListSerialization dataFromPropertyList:plistDict 
                                                       format:NSPropertyListXMLFormat_v1_0 
                                              errorDescription:&errorString];
[plistDict release];

if (!data) {
  NSLog(@"error converting data: %@", errorString);
  return NO;    
}

if ([data writeToFile:[XEraseAppDelegate loadSessionPlist] atomically: YES]) {
  return YES;
} else {

   NSLog(@"couldn't write to new plist");

 return NO;
}
1 голос
/ 22 января 2010

Это то, что я написал очень быстро, и он правильно записывает в каталог документов имя и компанию plist.Я чувствую, что у вашего метода создания словаря может быть проблема.Попробуйте сами, затем добавьте свой код и убедитесь, что он работает.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *plistDirectory = [paths objectAtIndex:0];
NSString *plistPath = [plistDirectory stringByAppendingPathComponent:@"userCompany.plist"];

NSArray *userObjects = [[NSArray alloc] initWithObjects:@"Joe", @"Smith", @"Smith Co", nil];
NSArray *userKeys = [[NSArray alloc] initWithObjects:@"First Name", @"Last Name", @"Company", nil];

NSDictionary *userSettings = [[NSDictionary alloc] initWithObjects:userObjects forKeys:userKeys];

[userSettings writeToFile:plistPath atomically:YES];
0 голосов
/ 25 февраля 2012

Я тоже столкнулся с этой проблемой. В моем случае оказалось, что я использовал NSNumbers для ключей - что недопустимо.

0 голосов
/ 22 января 2010

Вставить точку останова на

NSDictionary *choresDictionary = [[NSDictionary alloc] initWithDictionary:[self createDictionaryFromChoreList]];

теперь, когда вы выходите, наведите курсор мыши на choresDictionary и проверьте во всплывающей подсказке, что его размер не равен 0x0, или вы можете просто сделать NSLog из choresDictionary как NSLog(@"%@",choresDictionary); Я думаю, что в вашем словаре 0 пар ключей и значений ключей, поэтому вы получаете пустое значение в папке документов.

Спасибо

Madhup

0 голосов
/ 22 января 2010

Где именно вы ищете файл?

У меня точно такой же код, и он прекрасно работает для меня.

Просто я должен глубоко копать, чтобы получить файл. Что-то вроде:

/ Пользователи / myUserName / Библиотека / Поддержка приложений / Симулятор iPhone / Пользователь / Приложения / 0E62A607-8EEB-4970-B198-81CE4BDDB7AA / Documents / data.plist

И номер HEX в пути меняется при каждом запуске. Поэтому я печатаю путь к файлу при каждом запуске.

0 голосов
/ 22 января 2010

Правильно ли, что имя файла, в который вы записываете: SOEMTHINGchores.plist

Создано через:

NSString *plistName = [[NSString alloc] initWithFormat:@"%@chores.plist", self.firstName];

Кроме того, каков вывод:

[choresDictionary print];

Некоторая дополнительная информация поможет отладить это.

...