Pierwsze kroki z Core Data Tutorial

jest to skrócony rozdział z naszej książki Core Data by Tutorials, która została całkowicie zaktualizowana dla Swift 4.2 i iOS 12. Ten samouczek jest prezentowany w ramach naszego iOS 12 Launch Party-enjoy!

Witamy w Core Data!

w tym samouczku napiszesz swoją pierwszą aplikację danych podstawowych. Zobaczysz, jak łatwo jest rozpocząć korzystanie ze wszystkich zasobów dostępnych w Xcode, od szablonów kodu startowego po edytor modeli danych.

uderzysz w ziemię od samego początku. Pod koniec samouczka dowiesz się, jak:

  • dane modelu za pomocą edytora modeli Xcode
  • Dodaj nowe rekordy do danych podstawowych
  • Pobierz zestaw rekordów z danych podstawowych
  • wyświetl pobrane rekordy za pomocą widoku tabeli.

dowiesz się również, co Podstawowe Dane robią za kulisami i jak możesz wchodzić w interakcje z różnymi ruchomymi elementami.

pierwsze kroki

Otwórz Xcode i utwórz nowy projekt iOS oparty na szablonie aplikacji Single View. Nazwij listę przebojów aplikacji i upewnij się, że zaznaczono opcję Użyj podstawowych danych.

zaznaczenie pola Użyj podstawowych danych spowoduje, że Xcode wygeneruje kod boilerplate dla tego, co jest znane jako NSPersistentContainer w AppDelegate.swift.

NSPersistentContainer składa się z zestawu obiektów, które ułatwiają zapisywanie i pobieranie informacji z podstawowych danych. Wewnątrz tego kontenera znajduje się obiekt do zarządzania stanem podstawowych danych jako całości, obiekt reprezentujący Model danych i tak dalej.

standardowy stos działa dobrze dla większości aplikacji, ale w zależności od aplikacji i jej wymagań dotyczących danych, możesz dostosować stos, aby był bardziej wydajny.

Uwaga: Nie wszystkie szablony Xcode pod aplikacją iOS have mają możliwość rozpoczęcia od podstawowych danych. W Xcode 10 Tylko aplikacja Master-Detail i szablony aplikacji Single View mają pole wyboru Użyj podstawowych danych.

pomysł na tę przykładową aplikację jest prosty: będzie widok tabeli z listą nazw dla Twojej własnej „listy przebojów”. Będziesz mógł dodać nazwy do tej listy, a ostatecznie użyć podstawowych danych, aby upewnić się, że dane są przechowywane między sesjami. Nie akceptujemy przemocy na tej stronie, więc możesz myśleć o tej aplikacji jako liście ulubionych, aby śledzić znajomych też, oczywiście!

kliknij na Main.storyboard, aby otworzyć go w Interface Builder. Wybierz kontroler widoku na obszarze roboczym i umieść go w kontrolerze nawigacyjnym. Z menu edytora Xcode wybierz osadzanie w … Navigation Kontroler nawigacyjny .

kliknij na pasku nawigacyjnym kontrolera nawigacyjnego, aby go zaznaczyć, a następnie kliknij na duże tytuły w Inspektorze atrybutów. To da przykładowej aplikacji styl tytułu, który pasuje do aplikacji giełdowych Apple.

następnie przeciągnij Widok tabeli z biblioteki obiektów do kontrolera widoku, a następnie zmień jego rozmiar, aby obejmował cały widok.

jeśli nie jest jeszcze otwarty, użyj ikony znajdującej się w lewym dolnym rogu obszaru roboczego, aby otworzyć kontur dokumentu programu Interface Builder.

Ctrl-przeciągnij z widoku tabeli w obrysie dokumentu do jego widoku nadrzędnego i wybierz spację wiodącą do ograniczenia obszaru bezpiecznego:

zrób to jeszcze trzy razy, wybierając ograniczenia kończące przestrzeń do bezpiecznego obszaru, górną przestrzeń do bezpiecznego obszaru i wreszcie dolną przestrzeń do bezpiecznego obszaru. Dodanie tych czterech ograniczeń spowoduje, że widok tabeli wypełni swój widok nadrzędny.

następnie przeciągnij element przycisku paska i umieść go na pasku nawigacyjnym kontrolera widoku. Na koniec wybierz element przycisku paska i zmień jego element systemowy, aby dodać.

twoje płótno powinno wyglądać podobnie do poniższego zrzutu ekranu:

za każdym razem, gdy dotkniesz przycisku Dodaj, pojawi się kontroler alertów zawierający pole tekstowe. Stamtąd będziesz mógł wpisać czyjeś imię w polu tekstowym. Stuknięcie przycisku Save spowoduje zapisanie nazwy, zamknięcie kontrolera alertów i odświeżenie widoku tabeli, wyświetlając wszystkie wprowadzone nazwy.

ale najpierw musisz uczynić kontroler widoku źródłem danych widoku tabeli. W obszarze roboczym Ctrl-przeciągnij z widoku tabeli na żółtą ikonę kontrolera widoku nad paskiem nawigacyjnym, jak pokazano poniżej, i kliknij dataSource:

jeśli zastanawiasz się, nie musisz konfigurować delegata widoku tabeli, ponieważ dotknięcie komórek nie spowoduje żadnej akcji. To nie jest prostsze niż to!

otwórz edytor pomocniczy, naciskając Command-Option-Enter lub wybierając środkowy przycisk na zestawie narzędzi edytora na pasku Xcode.

Ctrl-przeciągnij z widoku tabeli do kontrolera ViewController.swift wewnątrz definicji klasy, aby utworzyć IBOutlet.

następnie nazwij nową właściwość IBOutlet tableView, co spowoduje następujący wiersz:

@IBOutlet weak var tableView: UITableView!

następnie Ctrl-przeciągnij z przycisku Dodaj do kontrolera ViewController.swift tuż poniżej Twojej viewDidLoad() definicji. Tym razem Utwórz akcję zamiast outlet, nazywając metodę addName, z typem UIBarButtonItem:

@IBAction func addName(_ sender: UIBarButtonItem) { }

możesz teraz odwołać się do widoku tabeli i działania elementu przycisku paska w kodzie.

następnie skonfigurujesz model widoku tabeli. Dodaj następującą właściwość do ViewController.swift pod tableView IBOutlet:

var names: = 

names jest zmienną tablicą zawierającą wartości łańcuchowe wyświetlane w widoku tabeli. Następnie zastąp implementację viewDidLoad() następującym:

override func viewDidLoad() { super.viewDidLoad() title = "The List" tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")}

spowoduje to ustawienie tytułu na pasku nawigacyjnym i zarejestrowanie klasy UITableViewCell w widoku tabeli.

Uwaga: register(_:forCellReuseIdentifier:) gwarantuje, że widok tabeli zwróci komórkę właściwego typu, gdy cell reuse identifier zostanie dostarczony do metody dequeue.

następny, nadal w ViewController.swift, dodaj następujące rozszerzenie UITableViewDataSource poniżej definicji klasy dla ViewController:

// MARK: - UITableViewDataSourceextension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return names.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = names return cell }}

jeśli kiedykolwiek pracowałeś z UITableView, ten kod powinien wyglądać bardzo znajomo. Najpierw zwracasz liczbę wierszy w tabeli jako liczbę pozycji w tablicy names.

następnie tableView(_:cellForRowAt:) usuwa komórki widoku tabeli i wypełnia je odpowiednim łańcuchem z tablicy names.

następnie musisz dodać nowe nazwy, aby Widok tabeli mógł je wyświetlić. Zaimplementuj metodę addName IBAction, którą Ctrl-przeciągnąłeś wcześniej do kodu:

// Implement the addName IBAction@IBAction func addName(_ sender: UIBarButtonItem) { let alert = UIAlertController(title: "New Name", message: "Add a new name", preferredStyle: .alert) let saveAction = UIAlertAction(title: "Save", style: .default) { action in guard let textField = alert.textFields?.first, let nameToSave = textField.text else { return } self.names.append(nameToSave) self.tableView.reloadData() } let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) alert.addTextField() alert.addAction(saveAction) alert.addAction(cancelAction) present(alert, animated: true)}

za każdym razem, gdy dotkniesz przycisku Dodaj, ta metoda wyświetli UIAlertController z polem tekstowym i dwoma przyciskami: Zapisz i Anuluj.

Save wstawia pola tekstowe bieżący tekst do tablicy names, a następnie przeładowuje widok tabeli. Ponieważ tablica names jest modelem wspierającym widok tabeli, cokolwiek wpiszesz w pole tekstowe, pojawi się w widoku tabeli.

na koniec Zbuduj i uruchom aplikację po raz pierwszy. Następnie naciśnij przycisk Dodaj. Kontroler alertów będzie wyglądał następująco:

dodaj cztery lub pięć nazwisk do listy. Powinieneś zobaczyć coś podobnego do poniżej:

twój widok tabeli wyświetli dane, a Twoja tablica będzie przechowywać nazwy, ale dużą rzeczą, której tu brakuje, jest trwałość. Tablica jest w pamięci, ale jeśli wymusisz zamknięcie aplikacji lub ponowne uruchomienie urządzenia, lista trafień zostanie wymazana. Podstawowe Dane zapewniają trwałość, co oznacza, że mogą przechowywać dane w bardziej trwałym stanie, dzięki czemu mogą przetrwać ponowne uruchomienie aplikacji lub ponowne uruchomienie urządzenia.

nie dodałeś jeszcze żadnych podstawowych elementów danych, więc nic nie powinno się utrzymywać po przejściu z dala od aplikacji. Sprawdźmy to. Naciśnij przycisk Home, Jeśli używasz urządzenia fizycznego lub równoważnego (Shift + ⌘ + H), jeśli używasz symulatora. Spowoduje to powrót do znanej siatki aplikacji na ekranie głównym:

na ekranie głównym dotknij ikony listy przebojów, aby przywrócić aplikację na pierwszy plan. Nazwiska wciąż są na ekranie. Co się stało?

po naciśnięciu przycisku Początek aplikacja znajdująca się obecnie na pierwszym planie przechodzi w tło. Gdy tak się stanie, System operacyjny Flash-zawiesza wszystko, co aktualnie znajduje się w pamięci, w tym ciągi znaków w tablicy nazw. Podobnie, gdy nadszedł czas, aby obudzić się i powrócić na pierwszy plan, system operacyjny przywraca to, co kiedyś było w pamięci, tak jakbyś nigdy nie opuścił.

Apple wprowadziło te postępy w wielozadaniowości w systemie iOS 4. Tworzą bezproblemowe wrażenia dla użytkowników iOS, ale dodają zmarszczki definicji trwałości dla programistów iOS. Czy nazwiska naprawdę się utrzymały?

Nie, Nie bardzo. Gdybyś całkowicie zabił aplikację w szybkim przełączniku aplikacji lub wyłączył telefon, te nazwy zniknąłyby. Możesz to również zweryfikować. Z aplikacją na pierwszym planie, wprowadź szybki przełącznik aplikacji. Możesz to zrobić, dwukrotnie dotykając przycisku Strona główna, jeśli urządzenie ma taki przycisk, lub powoli przeciągając go w górę od dołu ekranu, Jeśli korzystasz z iPhone ’ a X.

stąd przesuń migawkę aplikacji Listy przebojów w górę, aby zakończyć aplikację. Jeśli pracujesz na telefonie iPhone X, musisz długo nacisnąć migawkę aplikacji, aż pojawi się czerwony przycisk usuwania w prawym górnym rogu.

po usunięciu aplikacji z przełącznika aplikacji nie powinno być śladu Listy przebojów w żywej pamięci (bez kalambura). Sprawdź, czy nazwy zniknęły, powracając do ekranu głównego i dotykając ikony listy przebojów, aby uruchomić nowe uruchomienie.

różnica między zamrożeniem pamięci flash a trwałością może być oczywista, jeśli pracowałeś z systemem iOS od jakiegoś czasu i znasz sposób działania wielozadaniowości. W umyśle użytkownika nie ma jednak różnicy. Użytkownik nie obchodzi, dlaczego nazwy nadal istnieją, czy aplikacja poszła w tle i wróciła, czy dlatego, że aplikacja je zapisała i przeładowała. Wszystko, co się liczy, to nazwy są nadal tam, gdy aplikacja wraca!

więc prawdziwym testem trwałości jest to, czy Twoje dane nadal istnieją po uruchomieniu nowej aplikacji.

modelowanie danych

teraz wiesz, jak sprawdzić trwałość, możesz zagłębić się w podstawowe dane. Twój cel aplikacji HitList jest prosty: zachowaj nazwy, które wprowadzasz, aby były dostępne do przeglądania po uruchomieniu nowej aplikacji.

do tej pory używałeś zwykłych starych ciągów Swift do przechowywania nazw w pamięci. W tej sekcji zamienisz te ciągi na podstawowe obiekty danych.

pierwszym krokiem jest stworzenie modelu obiektu zarządzanego, który opisuje sposób, w jaki Dane podstawowe reprezentują dane na dysku.

domyślnie Core Data używa bazy danych SQLite jako trwałego magazynu, więc możesz myśleć o modelu danych jako schemacie bazy danych.

Uwaga: natkniesz się na słowo zarządzane trochę, gdy masz do czynienia z podstawowymi danymi. Jeśli widzisz „zarządzane” w nazwie klasy, na przykład w NSManagedObjectContext, są szanse, że masz do czynienia z podstawową klasą danych. „Zarządzane” odnosi się do zarządzania przez Core Data cyklem życia podstawowych obiektów danych.

nie należy jednak zakładać, że wszystkie podstawowe klasy danych zawierają słowo „zarządzane”. Większość nie. aby uzyskać wyczerpującą listę podstawowych klas danych, Sprawdź odniesienie do podstawowych ram danych w przeglądarce dokumentacji.

ponieważ zdecydowałeś się użyć podstawowych danych, Xcode automatycznie utworzył dla ciebie plik Modelu danych i nazwał go HitList.xcdatamodeld.

Otwórz Listę Przebojów.xcdatamodeld. Jak widać, Xcode ma potężny edytor modeli danych:

edytor modeli danych ma wiele funkcji, które możesz później zbadać. Na razie skupmy się na stworzeniu jednej podstawowej jednostki danych.

kliknij Dodaj encję w lewym dolnym rogu, aby utworzyć nową encję. Kliknij dwukrotnie nową jednostkę i zmień jej nazwę na Person, w ten sposób:

być może zastanawiasz się, dlaczego edytor modeli używa terminu Entity. ,czy nie zdefiniowałeś po prostu nowej klasy? Jak wkrótce zobaczysz, podstawowe dane mają własne słownictwo. Oto krótki przegląd niektórych terminów, z którymi często się spotykasz:

  • encja jest definicją klasy w danych podstawowych. Klasycznym przykładem jest Employee lub Company. W relacyjnej bazie danych encja odpowiada tabeli.
  • atrybut jest informacją dołączoną do konkretnej jednostki. Na przykład jednostka Employee może mieć atrybuty dla pracowników name, positioni salary. W bazie danych atrybut odpowiada konkretnemu polu w tabeli.
  • relacja jest łącznikiem między wieloma bytami. W danych podstawowych relacje między dwoma jednostkami są wywoływane do-jednej relacji, podczas gdy te między jednym a wieloma jednostkami są wywoływane do-wielu relacji. Na przykład Manager może mieć relację do wielu z zestawem pracowników, podczas gdy osoba Employee będzie zwykle miała relację do jednego ze swoim menedżerem.
Uwaga: prawdopodobnie zauważyłeś, że encje brzmią jak Klasy. Podobnie, atrybuty i relacje brzmią jak właściwości. Co za różnica? Core data entity można traktować jako definicję klasy, a managed object jako instancję tej klasy.

teraz wiesz, co to jest atrybut, możesz dodać atrybut do obiektu Person utworzonego wcześniej. Wciąż na liście przebojów.XCDATAMODELD, wybierz Person po lewej stronie i kliknij znak plus ( + ) pod atrybutami.

Ustaw nazwę nowego atrybutu na, er, name i zmień jego typ Na String:

w danych podstawowych atrybut może być jednego z kilku typów danych.

zapisywanie do danych podstawowych

Otwórz ViewController.swift, Dodaj następujący import modułu danych podstawowych poniżej importu UIKit :

import CoreData

ten import to wszystko, czego potrzebujesz, aby zacząć korzystać z interfejsu API podstawowych danych w kodzie.

następnie zamień definicję właściwości names na następującą:

var people: = 

będziesz przechowywać jednostki Personzamiast nazw łańcuchów, więc zmienisz nazwę tablicy służącej jako model danych widoku tabeli na people. Teraz przechowuje instancje NSManagedObject, a nie proste ciągi.

NSManagedObject reprezentuje pojedynczy obiekt przechowywany w danych podstawowych; musisz go użyć do tworzenia, edytowania, zapisywania i usuwania z magazynu danych podstawowych. Jak wkrótce zobaczysz, NSManagedObject jest zmiennokształtnym. Może przybrać formę dowolnego podmiotu w modelu danych, przywłaszczając sobie dowolne atrybuty i relacje, które zdefiniowałeś.

ponieważ zmieniasz model widoku tabeli, musisz również zastąpić obie metody źródła danych zaimplementowane wcześniej. Zamień rozszerzenie UITableViewDataSource na następujące:

// MARK: - UITableViewDataSourceextension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return people.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let person = people let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = person.value(forKeyPath: "name") as? String return cell }}

najistotniejsza zmiana tych metod następuje w tableView(_:cellForRowAt:). Zamiast dopasowywać komórki do odpowiedniego łańcucha w tablicy modelu, teraz dopasowujesz komórki do odpowiedniego NSManagedObject.

zwróć uwagę, jak pobierasz atrybut name z atrybutu NSManagedObject. To się dzieje tutaj.:

cell.textLabel?.text = person.value(forKeyPath: "name") as? String

Dlaczego musisz to robić? Jak się okazuje, NSManagedObject nie wie o atrybucie name zdefiniowanym w modelu danych, więc nie ma możliwości bezpośredniego dostępu do niego za pomocą właściwości. Jedynym sposobem na odczytanie wartości jest kodowanie klucz-wartość, potocznie określane jako KVC.

Uwaga: KVC jest mechanizmem w Fundacji umożliwiającym pośredni dostęp do Właściwości obiektu za pomocą łańcuchów znaków. W tym przypadku KVC sprawia, że NSMangedObject zachowuje się trochę jak słownik w czasie wykonywania.

kodowanie wartości klucza jest dostępne dla wszystkich klas dziedziczących z NSObject, w tym NSManagedObject. Nie można uzyskać dostępu do właściwości za pomocą KVC na szybkim obiekcie, który nie pochodzi z NSObject.

następnie znajdź addName(_:) i zamień save UIAlertAction na następujące:

let saveAction = UIAlertAction(title: "Save", style: .default) { action in guard let textField = alert.textFields?.first, let nameToSave = textField.text else { return } self.save(name: nameToSave) self.tableView.reloadData()}

pobiera tekst w polu tekstowym i przekazuje go nowej metodzie o nazwie save(name:). Xcode narzeka, ponieważ save(name:) jeszcze nie istnieje. Dodaj go poniżej addName(_:):

func save(name: String) { guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } // 1 let managedContext = appDelegate.persistentContainer.viewContext // 2 let entity = NSEntityDescription.entity(forEntityName: "Person", in: managedContext)! let person = NSManagedObject(entity: entity, insertInto: managedContext) // 3 person.setValue(name, forKeyPath: "name") // 4 do { try managedContext.save() people.append(person) } catch let error as NSError { print("Could not save. \(error), \(error.userInfo)") }}

to tutaj wkraczają Podstawowe Dane! Oto co robi kod:

  1. zanim będziesz mógł zapisać lub pobrać cokolwiek z podstawowego magazynu danych, najpierw musisz zdobyć NSManagedObjectContext. Kontekst obiektu zarządzanego można traktować jako „zdrapkę” w pamięci do pracy z obiektami zarządzanymi.

    pomyśl o zapisaniu nowego obiektu zarządzanego do podstawowych danych jako dwuetapowy proces: najpierw wstawiasz nowy obiekt zarządzany do kontekstu obiektu zarządzanego; gdy jesteś zadowolony, „zatwierdzasz” zmiany w kontekście obiektu zarządzanego, aby zapisać je na dysku.

    Xcode wygenerował już zarządzany kontekst obiektu jako część szablonu nowego projektu. Pamiętaj, że dzieje się tak tylko wtedy, gdy na początku zaznaczono pole Użyj podstawowych danych. Ten domyślny kontekst zarządzanego obiektu jest własnością NSPersistentContainer w delegacie aplikacji. Aby uzyskać do niego dostęp, najpierw otrzymasz odniesienie do delegata aplikacji.

  2. tworzysz nowy obiekt zarządzany i wstawiasz go do kontekstu obiektu zarządzanego. Możesz to zrobić w jednym kroku za pomocą statycznej metody NSManagedObject: entity(forEntityName:in:).

    możesz się zastanawiać, o co chodzi w NSEntityDescription. Przypomnijmy, że wcześniej NSManagedObject była nazywana klasą zmiennokształtną, ponieważ może reprezentować dowolną jednostkę. Opis encji to element łączący definicję encji z modelu danych z instancją NSManagedObject w czasie wykonywania.

  1. mając pod ręką NSManagedObject, ustawiasz atrybut name za pomocą kodowania klucz-wartość. Musisz przeliterować klucz KVC (w tym przypadkuname) dokładnie tak, jak jest on widoczny w modelu danych, w przeciwnym razie aplikacja ulegnie awarii w czasie wykonywania.
  2. zmiany zatwierdzasz na person i zapisujesz na dysku, wywołując save w kontekście zarządzanego obiektu. Uwaga save może spowodować błąd, dlatego wywołujesz go używając słowa kluczowego try w bloku do-catch. Na koniec włóż nowy zarządzany obiekt do tablicy people, aby pojawił się on po przeładowaniu widoku tabeli.

to trochę bardziej skomplikowane niż użycie tablicy ciągów, ale nie jest tak źle. Niektóre z kodu tutaj, takie jak uzyskanie kontekstu i encji zarządzanego obiektu, mogą być wykonane tylko raz we własnym init() lub viewDidLoad(), a następnie ponownie użyte później. Dla uproszczenia, robisz to wszystko w ten sam sposób.

Zbuduj i uruchom aplikację, a także dodaj kilka nazw do widoku tabeli:

jeśli nazwy są rzeczywiście przechowywane w podstawowych danych, aplikacja HitList powinna przejść test trwałości. Z aplikacją na pierwszym planie przejdź do szybkiego przełącznika aplikacji, a następnie zakończ go.

w Springboard stuknij aplikację Listy przebojów, aby uruchomić nowe uruchomienie. Czekaj, co się stało? Widok tabeli jest pusty:

zapisałeś do podstawowych danych, ale po uruchomieniu nowej aplikacji tablica people jest pusta! To dlatego, że dane leżą na dysku i czekają na ciebie, ale jeszcze ich nie pokazujesz.

pobieranie z podstawowych danych

aby uzyskać dane z trwałego magazynu do kontekstu obiektu zarządzanego, musisz je pobrać. Otwórz ViewController.swift i dodaj poniżej viewDidLoad():

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //1 guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } let managedContext = appDelegate.persistentContainer.viewContext //2 let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Person") //3 do { people = try managedContext.fetch(fetchRequest) } catch let error as NSError { print("Could not fetch. \(error), \(error.userInfo)") }}

krok po kroku, to właśnie robi kod:

  1. zanim będziesz mógł cokolwiek zrobić z podstawowymi danymi, potrzebujesz zarządzanego kontekstu obiektu. Pobieranie nie jest inne! Podobnie jak wcześniej, wyciągasz delegata aplikacji i chwytasz odniesienie do jego trwałego kontenera, aby dostać w swoje ręce jego NSManagedObjectContext.
  2. jak sama nazwa wskazuje, NSFetchRequest jest klasą odpowiedzialną za pobieranie z podstawowych danych. Żądania pobierania są zarówno wydajne, jak i elastyczne. Za pomocą żądań fetch można pobrać zbiór obiektów spełniających podane kryteria (np. daj mi wszystkich pracowników mieszkających w Wisconsin i są w firmie co najmniej trzy lata), indywidualne wartości (tj. podaj mi najdłuższe nazwisko w bazie danych) i więcej.

    żądania pobierania mają kilka kwalifikatorów używanych do udoskonalenia zwracanego zestawu wyników. Na razie powinieneś wiedzieć, że NSEntityDescription jest jednym z tych wymaganych kwalifikatorów.

    ustawienie właściwości fetch żądania entity lub alternatywnie zainicjalizowanie jej za pomocą init(entityName:), pobiera wszystkie obiekty określonej jednostki. To jest to, co robisz tutaj, aby pobrać wszystkie Person podmioty . Należy również zauważyć, że NSFetchRequest jest typem generycznym. To użycie generics określa oczekiwany Typ zwrotu żądania fetch, w tym przypadku NSManagedObject.

  3. przekazujesz żądanie pobierania do kontekstu obiektu zarządzanego, aby wykonać ciężkie podnoszenie. fetch(_:) zwraca tablicę zarządzanych obiektów spełniających kryteria określone w żądaniu fetch.

Uwaga: podobnie jak save(), fetch(_:) może również rzucić błąd, więc musisz go użyć w bloku do. Jeśli podczas pobierania wystąpił błąd, możesz sprawdzić błąd wewnątrz bloku catch i odpowiednio zareagować.

Zbuduj i uruchom aplikację. Natychmiast powinieneś zobaczyć listę nazwisk dodanych wcześniej:

świetnie! Wrócili z martwych (gra słów). Dodaj jeszcze kilka nazw do listy i uruchom ponownie aplikację, aby sprawdzić, czy zapisywanie i pobieranie działają. Poza usunięciem aplikacji, zresetowaniem symulatora lub wyrzuceniem telefonu z wysokiego budynku, nazwy pojawią się w widoku tabeli bez względu na wszystko.

Uwaga: w tej przykładowej aplikacji było kilka szorstkich krawędzi: za każdym razem trzeba było uzyskać zarządzany kontekst obiektu z aplikacji delegate i używałeś KVC, aby uzyskać dostęp do atrybutów encji, a nie bardziej naturalnego stylu obiektu person.name.

kluczowe punkty

  • Podstawowe Dane zapewniają trwałość na dysku, co oznacza, że dane będą dostępne nawet po zamknięciu aplikacji lub wyłączeniu urządzenia. Różni się to od trwałości w pamięci, która będzie zapisywać dane tylko tak długo, jak aplikacja jest w pamięci, na pierwszym planie lub w tle.
  • Xcode jest wyposażony w potężny edytor modeli danych, którego możesz użyć do utworzenia zarządzanego modelu obiektu.
  • model obiektu zarządzanego składa się z encji, atrybutów i relacji
  • encja jest definicją klasy w danych podstawowych.
  • atrybut jest informacją dołączoną do jednostki.
  • relacja jest łącznikiem między wieloma bytami.
  • An NSManagedObject jest reprezentacją podstawowej jednostki danych w czasie wykonywania. Możesz odczytywać i zapisywać do jego atrybutów za pomocą kodowania klucz-wartość.
  • potrzebujesz danych NSManagedObjectContext do save() lub fetch(_:) do i z danych podstawowych.

co dalej?

możesz pobrać ukończony projekt dla tego samouczka za pomocą przycisków „Pobierz materiały” na górze lub na dole tego samouczka.

w tym samouczku doświadczyłeś już kilku podstawowych koncepcji danych: modeli danych, encji, atrybutów, obiektów zarządzanych, kontekstów obiektów zarządzanych i żądań pobierania.

jeśli podobało ci się to, czego nauczyłeś się w tym samouczku, dlaczego nie sprawdzić kompletnej książki Core Data by Tutorials, dostępnej w naszym sklepie?

oto smak tego, co jest w książce:

1. Rozdział 1, twoja pierwsza aplikacja danych podstawowych: klikniesz plik New nowy projekt i napiszesz aplikację danych podstawowych od podstaw! W tym rozdziale omówiono podstawy konfigurowania modelu danych, a następnie dodawania i pobierania rekordów.

2. Rozdział 2, podklasy Nsmanagedobject: NSManagedObject jest podstawową klasą przechowywania danych Wykresów podstawowych obiektów danych. Ten rozdział nauczy Cię, jak dostosowywać własne podklasy obiektów zarządzanych do przechowywania i walidacji danych.

3. Rozdział 3: stos podstawowych danych: pod maską Podstawowe Dane składają się z wielu części współpracujących ze sobą. W tym rozdziale dowiesz się, jak te części pasują do siebie i odejdziesz od początkowego szablonu Xcode, aby zbudować własny, konfigurowalny system.

4. Rozdział 4, Pobieranie pośrednie: aplikacje będą pobierać dane przez cały czas,a Core Data oferuje wiele opcji efektywnego pobierania danych. Ten rozdział obejmuje bardziej zaawansowane żądania pobierania, predykaty, sortowanie i pobieranie asynchroniczne.

5. Rozdział 5, nsfetchedresultscontroller: widoki tabeli są podstawą wielu aplikacji na iOS, a Apple chce, aby Podstawowe Dane dobrze się z nimi bawiły! W tym rozdziale dowiesz się, jak kontroler NSFetchedResultsController może zaoszczędzić czas i Kod, gdy widoki tabeli są wspierane przez dane z danych podstawowych.

6. Rozdział 6, wersjonowanie i migracja: wraz z aktualizacją i ulepszeniem aplikacji jej model danych niemal na pewno będzie musiał ulec zmianie. W tym rozdziale dowiesz się, jak utworzyć wiele wersji modelu danych, a następnie przenieść użytkowników do przodu, aby mogli zachować swoje istniejące dane podczas aktualizacji.

7. Rozdział 7, testy jednostkowe: testowanie jest ważną częścią procesu rozwoju, i nie należy zostawiać podstawowych danych z dala od tego! W tym rozdziale dowiesz się, jak skonfigurować osobne środowisko testowe dla podstawowych danych i zobacz przykłady testowania modeli.

8. Rozdział 8. Pomiar i zwiększanie wydajności: Nikt nigdy nie narzekał, że aplikacja jest zbyt szybka, więc ważne jest, aby zachować czujność w kwestii śledzenia wydajności. W tym rozdziale dowiesz się, jak mierzyć wydajność aplikacji za pomocą różnych narzędzi Xcode, a następnie dowiesz się, jak radzić sobie z wolnymi plamami w kodzie.

9. Rozdział 9, wiele kontekstów obiektów zarządzanych: w tym ostatnim rozdziale rozszerzysz zwykły podstawowy stos danych o wiele kontekstów obiektów zarządzanych. Dowiesz się, w jaki sposób może to poprawić postrzeganą wydajność i sprawić, że architektura aplikacji stanie się mniej monolityczna i bardziej podzielona.

i aby pomóc osłodzić umowę, cyfrowe wydanie książki jest w sprzedaży za 44,99 dolarów! Ale nie czekaj — ta Cena sprzedaży jest dostępna tylko przez ograniczony czas.

mówiąc o słodkich ofertach, koniecznie sprawdźcie wspaniałe nagrody, które rozdajemy w tym roku w ramach iOS 11 Launch Party, w tym ponad $9,000 w nagrodach!

aby zakwalifikować się do tego epickiego konkursu na iOS 12, wszystko, co musisz zrobić, to zostawić komentarz na oryginalnym poście, informując nas, która książka lub Kurs jest twoją ulubioną na tej liście — lub którą nadchodzącą książkę lub kurs jesteś najbardziej podekscytowany!

mamy nadzieję, że spodoba Wam się ta aktualizacja i wypatrujcie kolejnych wydań i aktualizacji książek!

raywenderlich.com Weekly

The raywenderlich.com newsletter to najprostszy sposób, aby być na bieżąco ze wszystkim, co musisz wiedzieć jako programista mobilny.

Otrzymuj cotygodniowy przegląd naszych samouczków i kursów, a otrzymasz darmowy pogłębiony kurs e-mail jako bonus!

Średnia ocena

4.6/5

dodaj ocenę dla tej treści

Zaloguj się, aby dodać ocenę

56 ocen

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.