Записать данные в.plist

Я знаю, что вопрос может выглядеть похожим на многие ранее заданные вопросы, но я не смог понять, что делать после прочтения всех этих вопросов и ответов.

Я хочу написать несколько слов, которые имеют wordNames а также wordDefinitions, и немного ID и date ID, У меня есть следующий код, но у меня есть два вопроса о словаре, использующем массив с разными типами данных, и способ определения ключей для словаря.

Пожалуйста, исправьте меня, если весь файл.plist, который я создаю, неверен.

Заранее спасибо.

- (IBAction)addWord:(id)sender
{
NSString *destinationPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
destinationPath = [destinationPath stringByAppendingPathComponent:@"Box.plist"];

NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath:destinationPath]) 
{
    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"Box" ofType:@"plist"];
    [fileManager copyItemAtPath:sourcePath toPath:destinationPath error:nil];
}

// Load the Property List.  
NSMutableArray* wordsInTheBox = [[NSMutableArray alloc] initWithContentsOfFile:destinationPath];


NSString *wordName = word.name;
NSString *wordDefinition = word.definition;
NSInteger deckID;
NSDate addedDate;


//is this correct to have an array of different types?
NSArray *values = [[NSArray alloc] initWithObjects:wordName, wordDefinition, deckID, addedDate, nil]; 
//How and where am I supposed to define these keys?
NSArray *keys = [[NSArray alloc] initWithObjects: NAME_KEY, DEFINITION_KEY, DECK_ID_KEY, DATE_KEY, nil]; 
NSDictionary *dict = [[NSDictionary alloc] initWithObjects:values forKeys:keys];
[wordsInTheBox addObject:dict];
[wordsInTheBox writeToFile:destinationPath atomically:YES];
}

1 ответ

Решение

initWithContentsOfFile: всегда возвращает неизменный массив. Вы должны к этому:

NSMutableArray *wordsInTheBox = [[NSMutableArray alloc] initWithArray:[NSArray arrayWithContentsOfFile:destinationPath]];

То, что я не совсем понимаю, это где word переменная определена. Это ивар?

Если вы используете последнюю версию XCode (4.4 или 4.5), я рекомендую использовать гораздо более простые литералы для создания словаря.

NSDictionary *dict = @{NAME_KEY       : wordName, 
                       DEFINITION_KEY : wordDefinition, 
                       DECK_ID_KEY    : deckID, 
                       DATE_KEY       : addedDate};

Но я не вижу проблем с вашим словарным определением. Он должен работать.

Вы должны убедиться, что где-то определены NAME_KEY, DEFINITION_KEY и т. Д. Все заглавные буквы обычно используются только для макросов препроцессора, поэтому вы можете сделать что-то вроде этого:

#define NAME_KEY @"Name"
#define DEFINITION_KEY @"Definition"

Вы также можете просто использовать строки прямо в своем словаре:

NSDictionary *dict = @{@"Name"       : wordName, 
                       @"Definition" : wordDefinition, 
                       @"DeckID"     : deckID, 
                       @"Date"       : addedDate};

Но использование макросов тоже неплохая идея.

Другие вопросы по тегам