Как сохранить массив, полный пользовательских классов в iOS? - PullRequest
3 голосов
/ 02 апреля 2011

В приложении для iOS, которое я создаю для школьного проекта, у меня возникают проблемы с сохранением данных, хранящихся в NSMutableArray. Массив создается в файле делегата приложения, а затем делегаты для него создаются в различных других файлах контроллера представления. Данные, хранящиеся в массиве, состоят из пользовательских классов, состоящих из NSStrings и NSNumbers в качестве свойств.

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

Вещи, которые я пробовал:

Архивирование в методе WillTerminate. (ActivityArray - это мой массив)

- (void)applicationWillTerminate:(UIApplication *)application {
NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString* arrayFile = [documentsPath stringByAppendingPathComponent:@"arrayFile"];
[NSKeyedArchiver archiveRootObject:activityArray toFile:arrayFile];
[activityArray release];

И затем разархивирование в методе didFinishLaunchingWithOptions файла AppDelegate

    NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *arrayFile = [documentsPath stringByAppendingPathComponent:@"arrayFile"];
if ([fileManager fileExistsAtPath:arrayFile]) {
    NSLog(@"yes");
    activityArray = [NSMutableArray arrayWithContentsOfFile:arrayFile];
} else {
    activityArray = [[NSMutableArray alloc] init];
}

В соответствии с предложениями по другим вопросам, я сделал следующее в пользовательских классах, которые у меня есть (в этом классе 2 NSStrings, activityName и activityDescription).

- initWithCoder:(NSCoder *)aCoder {
self = [super init];
activityName = [[aCoder decodeObjectForKey:@"activityName"] retain];
activityDescription = [[aCoder decodeObjectForKey:@"activityDescription"] retain];
return self;
 }

-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:activityName forKey:@"activityName"];
[aCoder encodeObject:activityDescription forKey:@"activityDescription"];
}

Но, похоже, все это не работает для меня. Любая помощь с благодарностью. Я чувствую, что это должно быть довольно легко, но я просто не могу этого понять.

Ответы [ 3 ]

1 голос
/ 03 апреля 2011

Базовые данные на самом деле очень просты и быстры в реализации. Я написал в блоге о быстрой настройке несколько месяцев назад. Просто создайте сущности для представления различных созданных вами классов или добавьте свойства @dynamic самостоятельно.

Имейте в виду, что Базовые Данные ведут себя так же, как Массив, в которых могут храниться только объекты Таким образом, вам нужно использовать NSNumber для int \ float и т. Д.

0 голосов
/ 02 апреля 2011

Вы действительно проверили, выполняется ли ваш код архивации вообще?Под iOS 4 с включенной многозадачностью applicationWillTerminate: практически никогда не вызывается.Вместо этого вы должны поместить код в applicationDidEnterBackground:.

Что касается освобождения массива после архивации, то произойдет сбой, когда пользователь выйдет из приложения (оно будет приостановлено) и позже вернется (приложение простореактивирован, не перезапущен).В этом случае тот факт, что вы освободили массив, приведет к сбою приложения.

0 голосов
/ 02 апреля 2011

Вы можете сохранить свой массив, используя NSUserDefaults как это:

NSData *theData =  [NSKeyedArchiver archivedDataWithRootObject:activityArray];
[[NSUserDefaults standardUserDefaults] setObject:theData forKey:@"myArray"];

Затем вы можете получить объект сохранения следующим образом:

NSData *theData = [[NSUserDefaults standardUserDefaults] dataForKey:@"myArray"];
NSArray *activityArray = (NSArray *)[NSKeyedUnarchiver unarchiveObjectWithData:theData];

Однако, чтобы это работало, вы должны реализовать методы initWithCoder и encodeWithCoder для любых пользовательских объектов, которые вы упомянули.

...