Как мне загрузить и сохранить лист в строку и из нее? - PullRequest
0 голосов
/ 20 декабря 2011

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

Так что я думаю, что я понял, как загрузить файл (хотя я не пробовал это в xcode).

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults registerDefaults:[NSDictionary dictionaryWithContentsOfFile:
   [[NSBundle mainBundle] pathForResource:@"UserDefaults" ofType:@"plist"]]];

Я гуглил, как сохранить NSUserDefaults в plist, в строку и обратно, но ничего не нашел.

1 Ответ

0 голосов
/ 20 декабря 2011

Вы можете использовать асинхронный NSPropertyListSerialization API или просто удобные синхронные методы в NSDictionary.

Оформить обсуждение в NSDictionary Apple Docs на метод writeToFile: автоматически для получения дополнительной информации о том, как это работает

Кроме того, Эта статья содержит полезную информацию о сериализации какао в целом.

Используйте следующий код, который поможет вам в этом.

//Get the user documents directory
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//Create a path to save the details
NSString *backedUpUserDefaultsPath = [documentsDirectory stringByAppendingPathComponent:@"NSUserDefaultsBackup.plist"];
//Get the standardUserDefaults as an NSDictionary
NSDictionary *userDefaults = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];

//The easiest thing to do here is just write it to a file
[userDefaults writeToFile:backedUpUserDefaultsPath atomically:YES];

//Alternatively, you could use the Asynchronous version
NSData *userDefaultsAsData = [NSKeyedArchiver archivedDataWithRootObject:userDefaults];

//create a property list object
id propertyList = [NSPropertyListSerialization propertyListFromData:userDefaultsAsData
                                                   mutabilityOption:NSPropertyListImmutable
                                                             format:NULL
                                                   errorDescription:nil];
//Create and open a stream    
NSOutputStream *outputStream = [[NSOutputStream alloc] initToFileAtPath:backedUpUserDefaultsPath append:NO];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
outputStream.delegate = self; //you'll want to close, and potentially dealloc your stream in the delegate callback
[outputStream open];

//write that to the stream!
[NSPropertyListSerialization writePropertyList:propertyList 
                                      toStream:outputStream 
                                        format:NSPropertyListImmutable 
                                       options:NSPropertyListImmutable 
                                         error:nil];

Если вы хотите вернуться назад, вы можете просто сделать что-то вроде:

NSDictionary *dictionaryFromDisk = [NSDictionary dictionaryWithContentsOfFile:backedUpUserDefaultsPath];    

Или вы можете использовать подход stream / NSData из NSPropertyListSerialization, который аналогичен тому, как вы его сохраняете.

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