Persistência Desenvolvimento em ios
Persistência NSUserDefaults Property Lists Archiving SQLite Core Data
NSUserDefaults Classe NSUserDefaults usada para guardar pequenas quantidades de dados Não é necessário conhecimento adicional de bases de daos Trata-se de uma classe da Cocoa Foundation que permite que uma aplicação aceda e salvaguarde as suas preferências usando uma property list
NSUserDefaults: tipos de objectos Podem salvaguardar-se objectos dos seguintes tipos: NSData, NSString, NSNumber, NSDate, NSArray, NSDictionary Caso se pretenda armazenar outro tipo de objecto será necessário arquivá-lo, como veremos à frente ou dar-lhe uma destas formas, normalmente NSData, NSNumber ou NSString
NSUserDefaults: como usar (1) Criar instâncias dos dados nos formatos possíveis Armazenar os dados: NSUserDefaults *defaults = [NSUserDefaults standarduserdefaults]; [defaults setobject:primeironome forkey:@ primeironome"]; [defaults synchronize];
NSUserDefaults: como usar (2) Recuperar os dados: NSUserDefaults *defaults = [NSUserDefaults standarduserdefaults]; NSString *primeironome = [defaults objectforkey:@ primeironome"];
NSUserDefaults: demo (1) Criar e salvar uma view-based application para iphone: Contacto
NSUserDefaults: demo (2) Criar o interface no ContactoViewController.xib
NSUserDefaults: demo (3) Fazer as ligações sempre com o ctrl: Do textfield do primeironome para dentro dos {} s do interface do ContactoViewController (igual para ultimonome e idade) criar outlets
NSUserDefaults: demo (4) Fazer as ligações sempre com o ctrl: Do botão Guardar para mesmo antes do @end criar action
NSUserDefaults: demo (5) Guardar os dados: ContactoViewController.m, guardar: NSString *primeironome = [primeironometextfield text]; NSUserDefaults *defaults = [NSUserDefaults standarduserdefaults]; [defaults setobject:primeironome forkey:@"primeironome"]; [defaults synchronize];
NSUserDefaults: demo (6) Recuperar os dados: ContactoViewController.m, viewdidload NSUserDefaults *defaults = [NSUserDefaults standarduserdefaults]; NSString *firstname = [defaults objectforkey:@"firstname"];
Exercício 1
Sandbox Cada aplicação tem uma directoria Documents e só pode escrever/ler aí por questões de segurança, privacidade, leaks Home -> Library -> Application Support -> iphonesimulator Applications, Library, Media, tmp Na directoria Applications existe uma directoria para cada aplicação Cada aplicação tem ainda a directoria Documents que é usada para guardar os ficheiros do utilizador
Directorias das aplicações Documents: onde a aplicação guarda os seus dados (excepto o NSUserDefaults) NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsdirectory = [paths objectatindex:0]; Library: Onde são guardados os NSUserDefaults tmp: usada para ficheiros temporários. Não é guardado pela aplicação (itunes)
Directorias das aplicações Documents: onde a aplicação guarda os seus dados (excepto o NSUserDefaults) NSArray * NSSearchPathForDirectoriesInDomains ( NSSearchPathDirectory directory, NSSearchPathDomainMask domainmask, BOOL expandtilde ); NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsdirectory = [paths objectatindex:0]; Library: Onde são guardados os NSUserDefaults tmp: usada para ficheiros temporários. Não é guardado pela aplicação (itunes)
NSFilemanager (1) NSFilemanager *manager = [[NSFileManager alloc] init]; - (BOOL)createDirectoryAtPath:(NSString *)path withintermediatedirectories:(bool)createintermediates ayributes: (NSDicZonary *)ayributes error:(nserror **)error - (NSArray *)contentsofdirectoryatpath:(nsstring *)path error:(nserror **)error
NSFilemanager (2) - (NSString *)stringbyappendingpathcomponent:(nsstring *)astring - (NSString *)stringbydeleznglastpathcomponent - (BOOL)writeToFile:(NSString *)path atomically: (BOOL)useAuxiliaryFile encoding:(nsstringencoding)enc error: (NSError **)error + (id)stringwithcontentsoffile:(nsstring *)path encoding: (NSStringEncoding)enc error:(nserror **)error
Property Lists (1) Organizam os dados em named values, usando objectos de tipos diferentes Podem ser editadas com o Xcode ou com um editor de propriedades Podem ter objectos de vários tipos, desde que os seus elementos sejam serializáveis: NSArray, NSMutableArray, NSDictionary, NSMutableDictionary NSData, NSMutableData, NSString, NSMutableString NSNumber, NSDate
Property Lists (2) Ficheiros.plist armazenados na directoria do utilizador Caso consiga construir o seu modelo de dados só com estes tipos, pode usar listas de propriedades Continua a ser adequado para poucos dados Não é pesquisável
Property lists: como usar (1) Criar um NSData a partir de uma lista de propriedades + (NSData *)datawithpropertylist:(id)plist format:(nspropertylistformat)format // XML ou binário opzons:(nspropertylistwriteopzons)opt // =0 error:(nserror **)error
Property lists: como usar (2) Criar uma lista de propriedades a partir de NSData + (id)propertylistwithdata:(nsdata *)data opzons:(nspropertylistreadopzons)opt //mutable vs. imutable format:(nspropertylistformat *)format // XML ou binário error:(nserror **)error
Property lists: como usar (3) Escrever uma lista de propriedades para ficheiro Usar NSPropertyListSerializa1on para escrever para um NSData de depois - (BOOL) writetourl:(nsurl *)aurl atomically:(bool)atomically Ler uma lista de propriedades de um URL Ler o URl para um NSData - (id) initwithcontentsofurl:(nsurl *)aurl Depois usar NSPropertyListSerializa1on para transformar o NSData numa lista de propriedades
Archiving Mecanismo de persistência para qualquer objecto, por exemplo grafos Todos os objectos no grafo devem implementar o protocolo NSCoding - (void)encodewithcoder:(nscoder *)encoder - (id)initwithcoder:(nscoder *)decoder
SQLite Um só ficheiro com uma base de dados SQL Usada em diferentes ambientes que necessitam de bases de dados leves int sqlite3_open(cosnt char *filename, sqlite3 **db); int sqlite3_exec(sqlite3 *db, const char * sql, int (*callback)... int sqlite3_close(sqlite *db);
Core Data (1) Permite desenhar os modelos de dados visualmente sem escrever código (ficheiro.xcdatamodel) Classes <> Entidades Entidades constituídas por Atributos Relacionamentos Fetched properties (lazy loading)
Core Data (2) Objectos são guardados numa zona de memória persistente: SQLite por omissão Ficheiros binários Memória Usa Managed Objects que assumem o papel semelhante a uma instância
Core Data (3) Permite criar um mapeamento entre objectos (entidades como normalmente se faria em SQL ou com um DER) Criam-se modelos graficamente. É aconselhável fazê-lo semiautomaticamente com o Xcode (xcdatamodel file), definindo o mapeamento entre os objectos e a base de dados
Core Data (4) Para aceder aos objectos na base de dados é necessário um NSManagedObjectContext Usa-se a classe NSEntityDescription que permite aceder a entidades dentro de um contexto Usando property s acede-se a atributos sem necessidade de acessores. Depois de criar o modelo de dados, o Xcode gera o managed object de forma simples
Exercício Core Data
Bibliografia http://developer.apple.com/ http://www.stanford.edu/class/cs193p Beginning iphone Development, APRESS, Cap. 12