Wykorzystanie Core Data i SQLite do przechowywania danych.

Poradnik wykorzystanie CoreData do przechowywania danych.

W poradniku opiszę jak utworzyć aplikację dla iPhone przechowującą loginy i hasła. Aplikacja będzie używać Core Data do przechowywania danych i zostanie napisana przy użyciu języka Swift. Czas wykonania 1-2 godziny.

Funkcjonalnie aplikacja będzie zapewniała podstawową funkcjonalność:

  • Wyświetlanie listy nazwa i loginów.
  • Wprowadzanie przez użytkownika nowego wpisu z hasłem.
  • Umożliwi edycję wpisu oraz jego skasowanie.

StartPage DetailsPage

Tworzenie projektu

Utwórz nowy projekt uruchamiając XCode i wybierając File -> New -> Project, zaznacz Single View Application.

createproject

 

Wprowadź nazwę, wybierz język Swift i zaznacz “Use Core Data”.

 

projectname

 

Interfejs użytkownika

W pierwszej kolejności usuwamy plik ViewController.swift, nie będzie on nam potrzebny.

deletefile

Tworzymy nowy plik kontrolera MVC który będziemy używać do wyświetlenia listy.
Klasę nazywamy PasswordSaverTableViewController, dziedziczy ona po UITableViewController.

NewClass6

Usuwamy wszystkie metody z nowo utworzonej klasy, zostawiając tylko jej definicję, kod powinien wyglądać następująco:

Dodanie kontrolera do storyboard.

Przechodzimy do Main.storyboard, w którym usuwamy nieużywany ViewController.
W jego miejsce dodajemy Table View Controller.
Należy zaznaczyć, że nasz nowy kontroler będzie startowym, więc zaznaczamy opcję Is Initial View Controller.

NewController7

W celu podpięcia klasy PasswordSaverTableViewController do naszego Table View Controller przechodzimy do Custom Class i wybieramy klasę PasswordSaverTableViewController.

CustomClass8

Następnie obudowujemy nasz kontroler w Navigation Controller. Można to prosto wykonać wybierając menu Editor menu -> Embed In -> Navigation Controller.

NavController9

Dodanie przycisku dodawania do panelu nawigacji

W naszej aplikacji będziemy dodawać nowe hasła poprzez kliknięcie przycisku z symbolem plus. W tym celu dodajemy nowy button bar, w którym zmieniamy identyfikator na Add. Możemy zmienić tytuł panelu nawigacji na Password Saver.

NewButton10

Dodanie formularza do dodawania nowych haseł.

Dodajemy nową klasę DetailsViewController, dziedziczącą po UIViewController. Usuwamy z niej zbędny kod. Możemy teraz do storyboard dodać nowy formatkę View Controller i podpiąć nowo utworzoną klasę.

DetailsController11

Teraz już możemy utworzyć przejście z formularza tabeli z naszymi wpisami do formularza dodawania nowego wpisu. W tym celu tworzymy nowy Action segue. Z wciśniętym przyciskiem ctrl przeciągamy z symbolu plusa do formularza dodawania. Nowy segue nazywamy „add”

segueAdd12

W formualarzu dodajemy Navigation item, gdzie umieszczamy przyciski Cancel, Save oraz tytuł „Password details”

TitleDetails13

Pola edycji na formularzu

Nasz aplikacja będzie mogła zapisywać trzy pola: nazwę, login oraz hasło. Hasło będzie polem które będzie pokazywało gwiazdki, więc w celu ich odczytania dodamy przełącznik pokarz hasło.
W tym celu dodajemy trzy pola tekstowe. Poniżej dodajemy jedno pole Label oraz kontrolkę switch.
Kontrolkę switch przestawiamy w pozycję wyłączona.

NewFields14

Nasze pola musimy jeszcze wyrównać między sobą, oraz umieścić je w przestrzeni. Należy w tym celu wykonać wszystkie czynności pokazane na zdjęciu poniżej. Wyrównywanie wykonuje się z przyciskiem ctrl.

Wyrowanie15

W celu zakończenia wyrównywania musimy jeszcze rozwiązać ew. problemy klikając Resolve Auto Loyout Issues -> Update Frame. W tym samym miejscu można kliknąć Clear Constraint jeśli popełniliśmy błąd i chcemy zacząć od nowa.

Wyrowanie16

Musimy tylko jeszcze ustawić nasze pole z hasłem tak, żeby pokazywało gwiazdki zamiast tekstu. W tym celu zaznaczymy opcję Secure Text Entry. Można dodać też tekst z opisem znaczenia pól w opcji Placeholder.

EdycjaPol17

Łączenie pól formularza z kodem.

Kontrolki z formularza można połączyć z kodem na dwa sposoby. W pierwszym przypadku przeciągamy je z wciśniętym ctrl do klasy DetailsViewController, lub piszemy kod i łączymy je w Connection Inspector.

LaczenieKontrolek18

Otrzymujemy kod w klasie DetailsViewController:

Jeśli teraz uruchomimy nasz program w symulatorze, to zauważymy, że po wejściu do dodawania haseł nie możemy wyjść z formularza. Również nie pokazuje nam się hasło po kliknięciu na show password. Możemy teraz zmienić nasz kod, tak, żeby obie te funkcjonalności działały. Zmieniamy metody na poniższe:

Metoda dismissView zdejmuje nam z wierzchu obecny formularz i powraca do tabeli z hasłami.

Implementacja Core Data

W celu zaprojektowania naszej bazy danych otwieramy PasswordSaver.xcdatamodeld w którym dodajemy nowe Entity o nazwie Password. Do naszej encji dodajemy trzy atrybuty name, login, password, wszystkie typu string.

NowaEncja19

Następnie możemy do naszej encji wygenerować klasę modelu dziedziczącą po NSManagedObject. Klikamy Editor -> Create NSManagedObject Subclass. Należy jej od razu zmienić nazwę na nazwę naszego programu kropka nazwa encji.

Model20

Klasa Password powinna wyglądać następująco:

Implementacja dodawani nowych rekordów

W klasie DetailsViewController na samej górze implementujemy kontekst dostępu do danych.

Ważne jest dodanie również klauzuli importowania biblioteki CoreData

Dodajemy metodę służącą do dodawania nowych rekordów:

Oraz modyfikujemy metodą zapisującą:

Nasz klasa DetailsViewController powinna teraz wyglądać następująco:

Wyświetlanie zapisanych rekordów

Możemy już dodawać nasze hasła do bazy SQLite, ale nie widzimy co tam zapisaliśmy. Przyszła pora wyświetlić nasze wpisy w tabeli. W celu pobierania danych i wyświetlania w tabeli posłużymy się klasą NSFetchedResultsController która ułatwi nam wyświetlanie danych. Przed przystąpienie do kodowania musimy zmienić styl komórki naszej tabeli i nadać jej unikalny identyfikator w celu rozpoznania jej przy re-użyciu komórki. Zmieniamy jej też oznaczenie dostępu na Detail disclosure.

Tabela21

Możemy teraz dodać do naszej klasy PasswordSaverTableViewController import biblioteki CoreData. Następnie implementujemy kontekst dostępu do danych oraz obiekt klasy fetchedResultsController który będzie nam pomagał wyświetlać dane. W klasie dodajemy kod:

Musimy również dodać metodę która będzie pobierała rekordy z encji:

Oraz metodę odświeżania danych:

Ponieważ nasze dane chcemy pobierać i odświeżać przy każdym wyświetleniu tabeli musimy zmodyfikować metodę viewDidLoad() w której ustawimy również delegata obiektu fetchedResultsController na instancję naszej klasy.

Jeśli teraz zbudujemy nasz projekt, otrzymamy błąd, ponieważ klasa PasswordSaverTableViewController nie jest delegatem typu NSFetchedResultsControllerDelegate. Należy dodać taką deklarację zmieniając linię class PasswordSaverTableViewController: UITableViewController, NSFetchedResultsControllerDelegate {

Nasza klasa powinna wyglądać następująco:

Implementacja metod wyświetlania danych w tabeli.

Implementujemy po kolei metody:

Pobieranie ilości sekcji tabeli:

Pobieranie ilości rekordów w sekcji:

Pobieranie komórki naszej tabeli:

Aktualnie nasz program będzie wyświetlał dane w tabeli, będziemy mogli również dodać nowy rekord.

Kasowanie danych

Kasowanie danych w tabeli jest bardzo proste, należy przeciągnąć komórkę tabeli w lewą stronę i wcisnąć Delete. W celu dodania opcji kasowania danych należy dodać metodę:

Edycja danych

W celu edycji danych użyjemy ponownie formatki z detalami danych naszego hasła. W tym celu trzeba utworzyć segue z komórki do widoku detali. Wykonujemy to przytrzymując klawisz ctrl. Nowy segue nazwiemy edit w celu odróżnienia od akcji add.

SegueAdd22

Teraz musimy przygotować dane które będziemy edytować. W tym celu w klasie PasswordSaverTableViewController nadpisujemy metodę prepareForSegue:

Pobiera ona jeden rekord z tabeli i przekazuje do modelu w obiekcie typu DetailsViewController. Musimy teraz zaimplementować nasz model, w tym celu przechodzimy do klasy DetailsViewController i dopisujemy na początku:

Możemy również zaimplementować przekazywanie danych z modelu do pól tesktowych:

Dodajemy również metodę zapisującą edytowane dane:

I modyfikujemy naszą metodę zapisującą:

 

Na tym etapie nasz program ma możliwość edycji, dodawania i kasowania rekordów.

Zapraszam do zadawania pytań jeśli coś jest niejasne.

Michał