2015-06-16 1 views
0

Так что в моем last question я попросил совета по сохранению/загрузке из файла. Совет Plist был довольно впечатляющим, но, конечно, мне пришлось столкнуться с какой-то проблемой. Я уже заполнял контроллеры TableView> DetailView с помощью plist. Теперь мне нужно как-то сохранить мои данные (с parse.com). Вот мой текущий PLIST, я наполнил его вручную и для простоты (пожалуйста, не убивай меня) я сделал все детали строки:Добавление новых элементов для программирования программно [Обновлено]

<plist version="1.0"> 
<dict> 
    <key>orderID</key> 
    <array> 
     <string>idKMVX956</string> 
     <string>idEWUQ321</string> 
    </array> 
    <key>orderdate</key> 
    <array> 
     <string>28.06.2015</string> 
     <string>26.06.2015</string> 
    </array> 
    <key>match</key> 
    <array> 
     <string>Team 3 vs Team 4</string> 
     <string>Team 1 vs Team 2</string> 
    </array> 
    <key>date</key> 
    <array> 
     <string>20.06.2015</string> 
     <string>20.06.2015</string> 
    </array> 
    <key>sector</key> 
    <array> 
     <string>2</string> 
     <string>1</string> 
    </array> 
    <key>seat</key> 
    <array> 
     <string>R2S75</string> 
     <string>R1S1</string> 
    </array> 
    <key>price</key> 
    <array> 
     <string>120</string> 
     <string>60</string> 
    </array> 
</dict> 
</plist> 

Теперь мой вопрос - как добавить новый порядок в этом PLIST. Просто ради тестирования я написал этот метод:

- (void)saveToPlist 
{ 
    NSString *matchname = @"Team 5 vs Team 6"; 
    NSString *orderHistoryFile = [[NSBundle mainBundle] pathForResource:@"OrderHistory" ofType:@"plist"]; 
    orders = [[NSMutableDictionary alloc] initWithContentsOfFile:orderHistoryFile]; 
    match = [orders objectForKey:@"match"]; 
    NSLog(@"matches: %@", match); 
    [match addObject:matchname]; 
    NSLog(@"addedTeam; %@", match); 
    [match writeToFile:orderHistoryFile atomically:YES]; 

} 

Но в то время как второй NSLog показывает, что на самом деле линия «Команда 5 против Team 6» был добавлен в массив - никаких изменений не отображаются в Plist файле и не появляются на Tableview. Любые идеи почему?

@Update хорошо, я вижу, где моя ошибка была с writetofile. Однако теперь после выполнения этого метода - он работает один раз, и я могу видеть детали. Тогда я больше не могу загружать данные, и таблица не заполняется. Зачем? Update2 Так что я не могу писать в своем каталоге пакетов (для консультации). Это заставило меня попытаться переместить весь процесс в документы. Вот код, я написал:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSString *filePath = [[self fileDirectory] stringByAppendingString:@"OrderHistory.plist"]; 
    if (![[NSFileManager defaultManager]fileExistsAtPath:filePath]){ 
    [[NSFileManager defaultManager] copyItemAtPath:[[NSBundle mainBundle]pathForResource:@"OrderHistory" ofType:@"plist"] toPath:filePath error:nil]; 
    } 
    orders = [[NSDictionary alloc] initWithContentsOfFile:filePath]; 
    orderId = [orders objectForKey:@"orderID"]; 
    NSLog(@"count orders: %d", [orderId count]); 
} 
- (NSString *)fileDirectory{ 
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

} 

Теперь мой NSLog считая вещи выходных 0. Все отлично работает с каталогами расслоения, поэтому я подозреваю, что файл еще не создан в документах. Где моя ошибка?

+1

Ваша ошибка в строке: '[[self fileDirectory] stringByAppendingString: @" OrderHistory.plist "];' it должно быть '-stringByAppendingPathComponent', когда вы добавляете его как строку, вы пропустите'/', который имеет значение для directoryPath – 0yeoj

+0

Ок, я просто проснулся, и теперь все ясно. Спасибо за помощь ребята! – gradle

+0

Можете ли вы поделиться с нами ответом? – 0yeoj

ответ

1

Вы не можете записать в комплект приложений, поэтому вам необходимо сохранить файл в папке Documents или ее эквиваленте (например, папке Caches).

+0

Хорошо, я слушал ваши советы. Можете ли вы проверить мою обновленную проблему? – gradle

+0

@JanSzalke Вы не проверяете, работает ли 'copyItemAtPath' или нет, и вы не возвращаете объект' NSError', чтобы сообщить об ошибке. Вы выбираете работать в темноте, где вам не нужно. – Droppy

+0

Хорошо, я просто проснулся, и теперь все ясно. Спасибо за помощь ребята! – gradle

0

Ваша ошибка в строке: [[self fileDirectory] stringByAppendingString:@"OrderHistory.plist"];

Это должно быть -stringByAppendingPathComponent, когда вы добавляете его как строку вы пропустите /, которая имеет отношение к DirectoryPath.