Tutorial iOS – Salvando informações no Banco de Dados com uso do CoreData

On 2 de julho de 2014 by Conrado Carneiro

A primeira coisa a ser feita é definir o modelo que será utilizado no Banco de Dados, para isso selecione o arquivo CoreData.xcdatamodeld (1) criado no tutorial anterior, e adicione uma Entity (2) verifique se ela foi criada (3) e a seguir adicione os atributos que deseja armazenar em seu banco de dados, clicando no + (4)

Captura de Tela 2014-07-02 às 13.58.08

Em nosso exemplo iremos armazenar nomes de carros, por tanto, devemos criar um attribute do tipo String(2) com nome carro(1), lembrando que o nome não pode conter letras maiúsculas.

Captura de Tela 2014-07-02 às 14.01.37

 

Vamos agora, definir algumas configurações na interface, para isso selecione o arquivo Main_iphone.storyboard e adicione um NavigationController. Já aprendemos a fazer isso em um tutorial (aula) anterior. Para quem não está lembrando basta selecionar a ViewController na Interface Builder ir no menu Editor -> Embed In -> Navigation Controller. O resultado esperado será semelhante a imagem a seguir:

Captura de Tela 2014-07-02 às 14.06.14

Agora vamos adicionar uma Tabela, ela será a responsável em exibir os objetos armazenados no banco de dados.
Selecione a ViewController e no menu a direita em Object Library clique e arraste o objeto Table View(1) até a View(2) (que foi selecionada)

Captura de Tela 2014-07-02 às 14.10.46

 

Agora vamos adicionar um Botão (Bar Button Item) na Barra de Navegação (Navigation Bar), basta busca-lo na Object Library e arrastar para o local desejado.

Captura de Tela 2014-07-02 às 14.28.43

 

No botão “+” criado chamaremos uma nova ViewController para adicionar as informações ao Banco de Dados. Já na view atual, a Table View adiciona será responsável em recuperar e exibir as informações do banco de dados.

Chamando a View para adicionar informações ao banco:
1. Adicione mais uma ViewController a StoryBoard
2. Com a tecla CONTROL pressionada clique sobre o botão + adicionado na Barra de Navegação(1) e arraste até a nova ViewController Adicionada (2), conforme podemos perceber na imagem a seguir.

Captura de Tela 2014-07-02 às 14.41.52

Ao soltar, uma janela será exibida, escolha a opção PUSH. Essas opções são relacionadas a forma como a nova view será exibida. No caso a PUSH irá utilizar a Navigation Bar , e um botão de “voltar” será criado automaticamente.
Agora vamos programar a página ViewController criada.
Primeiro crie o arquivo em File -> New -> File no menu a esquerda escolha iOS -> CocoaTouch e no menu a direita Objective-C Class.
Escolha um nome para a classe, no exemplo, defini como AddCarroViewController e o SubClass Type é UIViewController.
Por fim, relacione a Classe criada ao ViewController, para isso, selecione a ViewController na StoryBoard (1) vá no menu a direita Identity Inspector (2) e defina o nome da class com o mesmo nome criado, que no nosso caso é AddCarroViewController (3)

Captura de Tela 2014-07-02 às 14.50.49
Pronto, agora adicione um UITextField(1) e um Botão(2), que serão utilizados para receber as informações e salva-las no banco respectivamente .

Captura de Tela 2014-07-02 às 14.53.31 Agora vamos adicionar também ao código, vocês já devem saber isso, então não irei detalhar.
(Caso haja dúvidas, pesquise no tutorial de mapas, passado anteriormente).
Vale ressaltar que o botão será do tipo Action, e não do tipo Outlet, basta ter atenção na hora de adiciona-lo e alterar.

Agora vamos precisar adicionar uma função responsável pela comunicação com o banco de dados. 
Adicione o código a baixo no arquivo AddCarroViewController.m

[sourcecode language=”objc” wraplines=”false” collapse=”false”]
– (NSManagedObjectContext *)managedObjectContext {
NSManagedObjectContext *context = nil;
id delegate = [[UIApplication sharedApplication] delegate];
if ([delegate performSelector:@selector(managedObjectContext)]) {
context = [delegate managedObjectContext];
}
return context;
}
[/sourcecode]

E o botão “Salvar” que foi criado deverá chamar a função a seguir:
**ATENÇÃO**
O nome @”Entity” definido na função insertNewObjectForEntityForName corresponde ao mesmo nome da Entity que definimos no arquivo de modelo do Banco de Dados.
A Key @”carro” corresponde ao nome do objeto em que criamos, também no modelo do Banco de Dados criado no inicio deste tutorial.

[sourcecode language=”objc” wraplines=”false” collapse=”false”]
– (void) salveCoreData {
NSManagedObjectContext *context = [self managedObjectContext];

// Create a new managed object
NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:context];
[newDevice setValue:self.textFiedCar.text forKey:@"carro"];

NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
NSLog(@"Não pode Salvar %@ %@", error, [error localizedDescription]);
} else {
NSLog(@"Salvo com sucesso!!");
}
}
[/sourcecode]

Será importante também adicionar a biblioteca no cabeçalho do arquivo:

#import <CoreData/CoreData.h>

Nesse momento, já podemos rodar o projeto e testar se está realmente salvando.
*** MUITA ATENÇÃO ***
Vale lembrar que se em algum momento desse tutorial você executou o Simulador, então o seu aplicativo deverá ser apagado no Simulador, se não sabe como fazer, o jeito mais fácil é redefinir as configurações dele, para isso abra o simulador e vá no menu:
iOS Simulador -> Reset Content and Settings

 

Ao executar o simulador, clicar no “+” preencher o campo com alguma informação(1) e clicar em Salvar (2) o resultado esperado será essa mensagem exibida no console (3). Se por algum motivo foi apresentado um erro, a primeira coisa que sugiro a fazer é “Excluir a aplicação” ou “resetar as configurações” do simulador”.

Captura de Tela 2014-07-02 às 15.15.49

 

No proximo tutorial irei ensinar a recuperar as informações salvas no Banco de Dados e exibi-las em uma tabela.

One Response to “Tutorial iOS – Salvando informações no Banco de Dados com uso do CoreData”

  • Muito bem explicado, agora estou com um problema onde quero salvar um registro que possui uma coluna de double, já tentei usar o NSNumber, já que o coredata só aceita objetos, mas mesmo assim não consegui, diz que são tipos incompatíveis, sabe o que eu devo fazer ?

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *