Plist не сохраняется из словаря (в документы)

Я пытался сохранить plist 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


person skylerl    schedule 22.01.2010    source источник


Ответы (7)


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

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

Редактировать01:

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

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

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

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

person TechZen    schedule 22.01.2010
comment
Я попытаюсь зафиксировать логическое значение, возвращаемое writeToFile. Я знаю, что это правильная папка «Документы», я сделал несколько точек останова и просмотрел объекты, и они действительно находятся в правильном месте. Изменить: он возвращает false, и я знаю, что ищу в нужной папке, потому что до сих пор я запускал только одно приложение в симуляторе. (Пришлось переформатировать). - person skylerl; 22.01.2010

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

Вот фрагмент кода, который я использую для записи информации в 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;
}
person Cory D. Wiles    schedule 22.01.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];
person Convolution    schedule 22.01.2010
comment
Путь: путь: /Users/slehan/Library/Application Support/iPhone Simulator/User/Applications/6BBA0A58-E759-44C1-B018-829EBC5254AD/Documents/namechores.plist Однако, когда я смотрю туда, файла нет. - person skylerl; 22.01.2010

Верно ли, что имя файла, в который вы пишете: SOEMTHINGchores.plist?

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

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

Кроме того, что является результатом:

[choresDictionary print];

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

person mr-sk    schedule 22.01.2010
comment
Да, это правильно. А у NSDictionary нет метода печати. - person skylerl; 22.01.2010

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

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

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

/Users/myUserName/Library/Application Support/iPhone Simulator/User/Applications/0E62A607-8EEB-4970-B198-81CE4BDDB7AA/Documents/data.plist

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

person Mihir Mathuria    schedule 22.01.2010
comment
Я ищу в аналогичной области; Я просто не думаю, что это пишет вообще. - person skylerl; 22.01.2010
comment
GUID в пути должен меняться только в том случае, если вы очищаете симулятор при каждом запуске, в противном случае следует использовать один и тот же путь. - person Toby Allen; 05.11.2010

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

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

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

Спасибо,

Мэдхуп

person Madhup Singh Yadav    schedule 22.01.2010

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

person Kevin    schedule 25.02.2012
comment
Можете ли вы уточнить, почему это недействительно / что действительно? - person Nathaniel Ford; 30.10.2012