2012-06-14 2 views
0

Я загружаю plist в NSArry, фильтрую этот массив, чтобы захватить нужные мне данные, а затем представить данные в UITableView. Это отлично работает.Запись фильтрованного NSArray обратно в plist

EDIT:

Я работаю с массивом словарей. Plist заполнен массивом словарей.

Это то, что я делаю:

NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/data.plist"]; 
//array is filled with dictionaries 
array = [NSMutableArray arrayWithContentsOfFile:filePath]; 

//filter the array to catch appropriate data (there are maybe 10 objects): 
self.arrayFiltered = [NSMutableArray arrayWithCapacity:[array count]]; 
NSDictionary *dict; 
for (dict in array) 
    if ([[dict valueForKey:@"globalKey"] isEqualToNumber:[NSNumber numberWithInt:year]]) 
     [arrayFiltrirani addObject:dict]; 

Теперь я заполняю Tableview с данными из arrayFiltered. Теперь я хочу удалить строку из tableView и arrayFiltered.

[self.arrayFiltrirani removeObjectAtIndex:indexPath.row]; 

НО НО !!! Как обновить исходный массив и сохранить его на plist?

+0

Что вы намеренное предпринять? Код, который вы предоставили, делает именно то, что вы говорите. Он принимает массив и превращает его в .plist. Вы хотите сохранить существующее содержимое файла, а также новое содержимое файла? Это то, что NSDictionary будет лучше подходит. – Justin

+0

Когда я сохраняю свой фильтрованный массив на plist, все предыдущие данные получают overriten, и теперь в plist есть только данные из массиваFiltered. – maxus182

+0

ok Я отвечу на это ниже ... – Justin

ответ

1

Мне удалось решить мою проблему. В основном я сделал 2 массива из основного массива, массива «Filtered» и «Other».

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/data.plist"]; 

array = [NSMutableArray arrayWithContentsOfFile:filePath]; 

self.arrayFiltered = [NSMutableArray arrayWithCapacity:[array count]]; 
self.arrayOther = [NSMutableArray arrayWithCapacity:[array count]]; 

NSDictionary *dict; 
for (dict in array) 
    if ([[dict valueForKey:@"globalKey"] isEqualToNumber:[NSNumber numberWithInt:godinaMjesec]]) 
     [arrayFiltered addObject:dict]; 
    else { 
     [arrayOther addObject:dict]; 
    } 

Теперь, когда я хочу, чтобы удалить данные из arrayFiltered (из которых Tableview принимает данные):

[self.arrayFiltered removeObjectAtIndex:indexPath.row]; 

Чтобы писать поверх исходного массива:

[self.arrayOther addObjectsFromArray:self.arrayFiltered]; 
[self.arrayOther writeToFile:filePath atomically:YES]; 

Это может быть это не правильный способ сделать это, но он работает для меня.

1

Поскольку вы используете словари, вы хотите, чтобы написать реальный объект словаря контейнер обратно в data.plist файл, так

NSDictionary *myDictionary = [masterArray objectAtIndex:indexOfDictionary]; 
NSMutableArray *myDataArray = [myDictionary objectForKey:@"dataArray"]; 
[myDataArray removeObject:objRemovedFromTable]; //or removeObjectAtIndex:indexPath.row 
NSString *filePath = [docsDirectory stringByAppendingPathComponent:@"data.plist"]; 
[masterArray writeToFile:filePath atomically:YES]; 
+0

Извините, но я не понимаю, что мне делать? В моем массиве у меня есть отверстие .plist со словарями. В моем массивеFiltered у меня есть словари, которые представлены в таблицеView (их всего лишь несколько, а не отверстие .plist!). Так что я должен сохранить исходный массив или arrayFiltered в .plist (writeToFile: filePath)? Если я удаляю Object из массиваFiltered и сохраняю его, он заменяет все остальное. Как найти dict, который я удаляю в исходном массиве? – maxus182

+0

Я не видел, как вы отредактировали свой ответ. Как получить indexOfDictionary? – maxus182

+0

Только вы можете ответить на это. Как вы получаете доступ к данным, которые заполняют таблицу? Дело в том, что вы должны записать файл контейнера обратно на диск, независимо от того, какой объект хранит ВСЕ словари, с которыми вы играете. – Justin

0

Если это большой PLIST файл, который занимает некоторое время, чтобы написать то вы можете использовать неправильный инструмент. Я бы использовал Core Data, чтобы включить удаление отдельных строк данных.

+0

Это не большой plist. – maxus182

Смежные вопросы