Проблема с чтением данных из списка - PullRequest
0 голосов
/ 30 апреля 2011
- (void)viewDidLoad {
   [super viewDidLoad];

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

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if (![fileManager fileExistsAtPath: path]) 
    {
        path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat: @"plist.plist"] ];
    }

    NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
    int value = 5;
    [data setObject:[NSNumber numberWithInt:value] forKey:@"value"];
    [data writeToFile: path atomically:YES];
    [data release];

    NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
    int value1;
    value1 = [[savedStock objectForKey:@"value"] intValue];
    **NSLog(@"%i",value1);**
    [savedStock release];


}

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

Ответы [ 2 ]

3 голосов
/ 30 апреля 2011

Проблема

В вашем коде:

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

path содержит путь к файлу с корнем в каталоге документов. Допустим, это …/plist.plist.

NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath: path]) 
{
    path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat: @"plist.plist"] ];
}

Это странно. Если файл не существует, вы добавляете /plist.plist к переменной path, которая становится …/plist.plist/plist.plist, которая, скорее всего, не существует. Учитывая это,

NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: path];

-initWithContentsOfFile: возвращает nil, поэтому data равно nil, поэтому:

int value = 5;
[data setObject:[NSNumber numberWithInt:value] forKey:@"value"];
[data writeToFile: path atomically:YES];
[data release];

ничего не делает и в:

NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
int value1;
value1 = [[savedStock objectForKey:@"value"] intValue];

savedStock также nil, следовательно, -objectForKey:, за которым следует -intValue, возвращает 0.

NSLog(@"%i",value1);
[savedStock release];

Для проверки моего предположения используйте отладчик или NSLog() для проверки содержимого path, data и savedStock.

Одно решение

Если файл не существует, вы не можете прочитать его. Таким образом:

NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath: path]) 
{
    path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat: @"plist.plist"] ];
}

NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: path];

должно быть:

NSFileManager *fileManager = [NSFileManager defaultManager];
NSMutableDictionary *data;

if ([fileManager fileExistsAtPath: path]) 
{
    // If the file exists, read dictionary from file
    data = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
}
else
{
    // If the file doesn’t exist, create an empty dictionary
    data = [[NSMutableDictionary alloc] init];
}

и

int value = 5;
[data setObject:[NSNumber numberWithInt:value] forKey:@"value"];
[data writeToFile: path atomically:YES];
[data release];

должен создать …/plist.plist, содержащий словарь. И:

NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
int value1;
value1 = [[savedStock objectForKey:@"value"] intValue];
NSLog(@"%i",value1);
[savedStock release];

должно работать, потому что соответствующий файл был создан на предыдущих шагах.

0 голосов
/ 30 апреля 2011
contentArray = [NSArray arrayWithContentsOfFile:plistPath];

вам нужно разместить приведенный выше код там, где вы хотите получить значения из вашего plist-файла. Вам просто нужно указать путь вашего plist, и он преобразует ваш файл plist в массив. Затем вы можете получить доступ к этому массиву, чтобы получить данные из вашего plist-файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...