Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Mobile Development
Code

Core Data з нуля: стэк Core Data

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Core Data from Scratch.
Core Data from Scratch: Data Model

Belarusian (беларуская мова) translation by Alex Grigorovich (you can also view the original English article)

ўвядзенне

Фреймворк Core Data існуе ўжо шмат гадоў. Ён выкарыстоўваецца ў тысячах прыкладанняў і мільёнамі людзей, як на iOS, так і на OS X. Core Data падтрымліваюцца Apple і вельмі добра дакументаваны. Гэта які адбыўся фреймворк, які даказвае сваю каштоўнасць зноў і зноў.

Core Data выкарыстоўвае перавагі мовы Objective-C і яго асяроддзя і плаўна інтэгруецца з базай Core Foundation. Вынік - простая ў выкарыстанні інфраструктура для кіравання графам аб'ектаў, элегантны ў выкарыстанні і неверагодна эфектыўны з пункту гледжання выкарыстання памяці.

1. Патрабаванні

Нягледзячы на ​​тое, што Core Data ня складаная сама па сабе, калі вы пачатковец у распрацоўцы на iOS або OS X, я рэкамендую вам спачатку азнаёміцца ​​з нашай серыяй урокаў аб распрацоўцы на iOS. Яна навучыць вас асновам распрацоўкі на iOS, і пасля завяршэння серыі ў вас будзе дастаткова ведаў для вывучэння больш складаных тым, такіх як Core Data.

Як я ўжо сказаў, Core Data не такая складаная для разумення, як думаюць многія распрацоўшчыкі. Тым не менш, я ўпэўнены, што добрая база мае вырашальнае значэнне для паскарэння працы з Core Data. У вас павінна быць разуменне API Core Data, каб пазбегнуць няправільнага прымянення і пераканацца, што вы не сутыкнецеся з праблемамі пры выкарыстанні фреймворка.

Кожны кампанент Core Data мае пэўную мэту і функцыю. Калі вы паспрабуеце выкарыстоўваць Core Data такім чынам, якім ён не быў задуманы, вы непазбежна сутыкнецеся з цяжкасцямі выкарыстання фреймворка.

Тое, што я распавяду ў гэтай серыі аб Core Data, дастасавальна да iOS 6+ і OS X 10.8+, але асноўная ўвага будзе нададзена iOS. У гэтай серыі я буду працаваць з Xcode 5 і iOS 7 SDK.

2. Вывучаем Крывыя

Структура Core Data можа здацца складанай на першы погляд, але API становіцца інтуітыўна зразумелым і лаканічны, як толькі вы зразумееце, як розныя часткі ўзаемадзейнічаюць адзін з адным. І гэта менавіта тая частка, дзе большасць распрацоўнікаў сутыкаюцца з праблемамі. Яны спрабуюць выкарыстоўваць Core Data, перш чым яны ўбачаць усю пазл, і не ведаюць, як часткі галаваломкі суадносяцца адзін з адным.

У гэтым артыкуле я дапамагу вам азнаёміцца ​​з так званым ядром Core Data. Як толькі вы зразумееце ключавыя моманты ў стэку Core Data, структура будзе здавацца менш складанай, і вы нават пачнеце атрымліваць асалоду ад і ацэніце добра прадуманы API фреймворка.

У адрозненне ад такіх сістэм, як UIKit, якія вы можаце выкарыстоўваць без разумення структуры ў цэлым, Core Data патрабуе правільнага разумення сваіх кампанентаў. Важна надаць час, каб азнаёміцца ​​з фреймворком, што мы і зробім у гэтым уроку.

3. Што такое Core Data?

Распрацоўшчыкі, пачаткоўцы ў Core Data, часта чакаюць, што яна будзе працаваць як база дадзеных. Калі і ёсць тое, што я спадзяюся вы запомніце з гэтай серыі, гэта тое, што Core Data не з'яўляецца базай дадзеных, і такім чынам вы не павінны чакаць, што яна будзе дзейнічаць як яна.

Што такое Core Data, калі гэта не база дадзеных? Core Data - гэта мадэльны ўзровень вашага прыкладання ў самым шырокім сэнсе. Гэта мадэль у шаблоне Model-View-Controller які пранізвае IOS SDK.

Core Data - гэта не база дадзеных для вашага прыкладання, а таксама API для захоўвання дадзеных у базе дадзеных. Core Data - гэта структура, якая кіруе графам аб'ектаў. Гэта ўсё. Core Data могуць захоўваць гэты граф аб'ектаў, запісваючы яго на дыск, але гэта не асноўная мэта структуры.

4. Стэк Core Data

Як я ўжо згадваў раней, ядро ​​Core Data з'яўляецца асновай Core Data. Гэта набор аб'ектаў, якія прымушаюць Core Data працаваць. Ключавымі аб'ектамі стэка з'яўляюцца мадэль кіраваных аб'ектаў, пастаянны каардынатар сховішчы і адзін або некалькі кантэкстаў кіраваных аб'ектаў. Давайце пачнем з хуткага аналізу кожнага кампанента.

NSManagedObjectModel

Мадэль кіраваных аб'ектаў - гэта мадэль дадзеных прыкладання. Нягледзячы на ​​тое, што Core Data не з'яўляецца базай дадзеных, вы можаце параўнаць мадэль кіраваных аб'ектаў са схемай базы дадзеных, гэта значыць яна ўтрымлівае інфармацыю пра мадэлі або аб'ектах графа, якія атрыбуты яны маюць і як яны ставяцца да адзін аднаго.

Аб'ект NSManagedObjectModel ведае аб мадэлі дадзеных, загружаючы адзін або некалькі файлаў мадэлі дадзеных падчас яе ініцыялізацыі. Мы разгледзім, як гэта працуе праз некалькі імгненняў.

NSPersistentStoreCoordinator

Як і паказвае яго імя, аб'ект NSPersistentStoreCoordinator захоўвае дадзеныя на дыску і гарантуе сумяшчальнасць сховішчаў і мадэляў дадзеных. Ён з'яўляецца пасярэднікам паміж пастаянным сховішчам (сховішчамі) і кантэкстам (-амі) кіраванага аб'екта, а таксама займаецца загрузкай і кэшаваннем дадзеных. Так і ёсць. У Core Data ўбудавана кэшаванне.

Пастаянны каардынатар сховішчы з'яўляецца правадніком аркестра Core Data. Нягледзячы на ​​сваю важную ролю ў стэку Core Data, мы рэдка ўзаемадзейнічаем з ім напрамую.

NSManagedObjectContext

Аб'ект NSManagedObjectContext кіруе наборам аб'ектаў мадэлі, асобнікамі класа NSManagedObject. Магчыма мець некалькі кантэкстаў кіраваных аб'ектаў. Кожны кантэкст кіраванага аб'екта падтрымліваецца сталым каардынатарам сховішчы.

Вы можаце выявіць кантэкст кіраванага аб'екта ў выглядзе працоўнай прасторы, у якім вы працуеце з аб'ектамі мадэлі. Вы загружаеце іх, кіруеце імі і захоўваеце іх на гэтым своеасаблівым варштаце. Загрузка і захаванне апавяшчаюцца пастаянным каардынатарам сховішчы. Вы можаце мець некалькі працоўных прастор, што карысна, калі ваша прыкладанне Шматструменная, да прыкладу.

Хоць мадэль кіраваных аб'ектаў і пастаянны каардынатар сховішчы могуць быць падзеленыя паміж патокамі, кантэксты кіраваных аб'ектаў ніколі не павінны быць даступныя з патоку, адрознага ад таго, у якім яны былі створаны. Мы абмяркуем шматструменнасць больш падрабязна пазней у гэтай серыі.

5. Вывучэнне стэка Core Data

Крок 1: Шаблон Xcode

Давайце разгледзім стэк Core Data больш падрабязна, зірнуўшы на шаблон Xcode Apple для Core Data. Стварыце новы праект у Xcode 5, выбраўшы New>Project... у меню File. Абярыце шаблон "Пустое прыкладанне" са спісу шаблонаў прыкладанняў iOS злева.

Назавіце праект Core Data, усталюйце Devices на значэнне iPhone і ўсталюеце сцяжок Выкарыстоўваць асноўныя дадзеныя. Пакажыце Xcode, дзе вы хочаце захаваць файлы праекта і націсніце «Стварыць».

Крок 2: Агляд

Па змаўчанні Apple змяшчае код, звязаны з Core Data ў клас дэлегавання прыкладання, клас TSPAppDelegate ў нашым прыкладзе. Пачнем з вывучэння інтэрфейсу TSPAppDelegate.

Як вы можаце бачыць, дэлегат прыкладання мае ўласцівасць для кожнага кампанента стэка асноўных дадзеных, а таксама два зручных метаду: saveContext і applicationDocumentsDirectory.

Звярніце ўвагу, што ўласцівасці Core Data адзначаны як readonly, што азначае, што асобнікі не могуць быць зменены аб'ектамі, выдатнымі ад самага прыкладання.

Рэалізацыя TSPAppDelegate значна цікавей і пакажа нам, як працуе мадэль аб'екта, пастаянны каардынатар сховішчы і кантэкст кіраваных аб'ектаў працуюць разам. Пачнем з пачатку.

Паколькі ўласцівасці ў інтэрфейсе класа TSPAppDelegate абвяшчаюцца як readonly, не ствараюцца метады setter. Першая дырэктыва @synthesize паведамляе кампілятара звязаць зменную асобніка _managedObjectContext з уласцівасцю managedObjectContext, якое мы абвясцілі ў інтэрфейсе класа. Гэта агульны шаблон для гультаяватай загрузкі аб'ектаў.

Вы можаце дамагчыся таго ж выніку, выкарыстоўваючы пашырэнне прыватнага класа ў файле рэалізацыі класа. Зірніце на наступны фрагмент кода. Дырэктывы @synthesize не патрэбныя, калі вы карыстаецеся пашырэнне прыватнага класа.

Хоць я звычайна выкарыстоўваю і аддаю перавагу пашырэнне прыватнага класа, мы будзем прытрымлівацца шаблону Apple для гэтага ўрока.

Настройка стэка Core Data фактычна даволі простая з пункту гледжання метадаў, якія неабходна рэалізаваць. Apple не выкарыстоўвае спецыяльныя метады налады для стварэння пакета Core Data. Тры ключавых аб'екта стэка Core Data ствараюцца, калі яны неабходныя. Іншымі словамі, яны паэтапна загружаюцца або ствараюцца.

На практыцы гэта азначае, што рэалізацыя класа TSPAppDelegate падобная на тое, што вы чакаеце ў класе дэлегавання прыкладання, за выключэннем метадаў saveContext і applicationDocumentsDirectory, а таксама метадаў getter для кіраванага ObjectContext, managedObjectModel і persistentStoreCoordinator. Менавіта ў гэтых метадах адбываецца чараўніцтва. Гэта адна з жамчужын Core Data, налада вельмі простая і ўзаемадзеянне з Core Data гэтак жа простая.

Крок 3: Кантэкст кіраванага аб'екта

Клас, які вы будзеце выкарыстоўваць часцей за ўсё, акрамя NSManagedObject, пры ўзаемадзеянні з асноўнымі дадзенымі - гэта NSManagedObjectContext. Пачнем з вывучэння яго геттера.

Першыя тры радкі яго рэалізацыі тыповыя для геттера, які паэтапна загружае зменную асобніка. Калі аб'ект NSManagedObjectContext ня роўны нулю, ён вяртае аб'ект. Цікавы момант - гэта фактычнае стварэнне аб'екта NSManagedObjectContext.

Спачатку мы атрымліваем спасылку на каардынатар сховішчы захавання, выклікаючы яго метад getter. Пастаянны каардынатар сховішчы таксама загружаецца паэтапна, як мы ўбачым у наступны момант. Калі пастаянны каардынатар сховішчы ня роўны нулю, мы ствараем асобнік NSManagedObjectContext і ўсталёўваны яго ўласцівасць persistentStoreCoordinator і перадаем яго пастаяннага каардынатара сховішчы. Гэта было не занадта складана. Ці не так?

Такім чынам, кантэкст кіраванага аб'екта кіруе наборам аб'ектаў мадэлі, асобнікамі класа NSManagedObject і захоўвае спасылку на пастаянны каардынатар сховішчы. Памятаеце пра гэта, чытаючы астатнюю частку гэтага артыкула.

Крок 4: Пастаянны каардынатар крамы

Як мы ўжо бачылі, метад persistentStoreCoordinator выклікаецца метадам managedObjectContext. Зірніце на рэалізацыю persistentStoreCoordinator, але не дазваляйце гэтага напалохаць вас. На самай справе гэта не так складана.

Вы напэўна захочаце захаваць граф аб'ектаў Core Data на дыску, а шаблон Xcode Apple выкарыстоўвае базу дадзеных SQLite для дасягнення гэтай мэты.

Калі мы ствараем пастаянны каардынатар сховішчы ў persistentStoreCoordinator, мы паказваем месцазнаходжанне сховішчы на ​​дыску. Пачнем з стварэння аб'екта NSURL, які паказвае на гэтае месца ў ізаляванай праграмнай асяроддзі прыкладання. Мы выклікаем applicationDocumentsDirectory, дапаможны метад, які вяртае месцазнаходжанне, аб'ект NSURL, у каталогу Documents ў ізаляванай праграмнай асяроддзі прыкладання. Мы дадаем Core_Data.sqlite да месцазнаходжання і захоўваем яго ў storeURL для наступнага выкарыстання.

Па змаўчанні імя сховішчы на ​​дыску супадае з імем праекта. Вы можаце змяніць яго на любое, якое захочаце.

Як я ўжо казаў, пашырэнне .sqlite падказвае, што сховішча на дыску ўяўляе сабой базу дадзеных SQLite. Нягледзячы на ​​тое, што Core Data падтрымлівае некалькі тыпаў сховішчаў, SQLite на сённяшні дзень з'яўляецца найбольш выкарыстоўваным тыпам сховішчы з-за яго хуткасці і надзейнасці.

На наступным кроку мы ствараем асобнік пастаяннага каардынатара сховішчы, выклікаючы initWithManagedObjectModel: і перадаем асобнік NSManagedObjectModel. Мы атрымліваем спасылку на мадэль кіраваных аб'ектаў, выклікаючы метад managedObjectModel, які мы разгледзім далей.

Цяпер у нас ёсць асобнік класа NSPersistentStoreCoordinator, але пакуль няма звязанага з ім сховішчы. Мы дадаем сховішча да пастаяннага каардынатара, выклікаючы даволі ўражлівы метад: addPersistentStoreWithType:configuration:URL:options:error:.

Першы аргумент паказвае тып сховішчы NSSQLiteStoreType ў гэтым прыкладзе. Core Data таксама падтрымлівае двайковыя сховішчы (NSBinaryStoreType) і сховішча ў памяці (NSInMemoryStoreType).

Другі аргумент паведамляе Core Data, якую канфігурацыю выкарыстоўваць для пастаяннага сховішчы. Мы перадаем nil, які паведамляе Core Data выкарыстоўваць канфігурацыю па змаўчанні. Трэці аргумент - гэта месцазнаходжанне сховішчы, якое захоўваецца ў storeURL.

Чацвёрты аргумент - гэта NSDictionary - опцыі, якія дазваляюць нам змяняць паводзіны пастаяннага сховішчы. Мы разгледзім гэты аспект пазней у гэтай серыі і пяройдзем цяпер да nil. Апошні аргумент - спасылка на паказальнік NSError.

Калі памылкі не з'яўляюцца, гэты метад вяртае аб'ект NSPersistentStore. Мы не захоўваем спасылкі на пастаяннае сховішча, таму што нам не трэба ўзаемадзейнічаць з ім, як толькі ён дадаецца ў пастаянны каардынатар.

Аднак, калі даданне ўстойлівага сховішчы не атрымоўваецца, гэта значыць, што праблема звязаная з пастаянным сховішчам прыкладання, і нам неабходна зрабіць крокі для вырашэння праблемы. Калі гэта адбываецца і чаму гэта адбываецца, прадмет асобнай гутаркі.

На дадзены момант перапыненне выклікаецца, калі addPersistentStoreWithType:configuration:URL:options:error: вяртае nil. Як тлумачаць каментары ў інструкцыі if, вы ніколі не павінны выклікаць перапыненне ў рабочай асяроддзі, таму што гэта прыводзіць да збою прыкладання. Мы выправім гэта пазней у нашай серыі.

Крок 5: Кіраваная мадэль аб'екта

Трэці і апошні фрагмент галаваломкі - гэта мадэль кіраваных аб'ектаў. Давайце паглядзім на getter ўласцівасці managedObjectModel.

Рэалізацыя яго вельмі простая. Мы захоўваем месцазнаходжанне мадэлі прыкладання ў modelURL і перадаем modelURL ў initWithContentsOfURL: для стварэння асобніка класа NSManagedObjectModel.

На дадзены момант вы, верагодна, задаецца пытаннем, на што паказвае мадэль ModelURL, і што такое файл з пашырэннем .momd. Каб адказаць на гэтыя пытанні, нам трэба высветліць, што яшчэ стварыў Xcode для нас падчас налады праекта.

У навігатараў праектаў злева вы павінны ўбачыць файл з імем Core_Data.xcdatamodeld. Гэта мадэль дадзеных прыкладання, скампіляваны ў файл .momd. Гэта файл .momd, які выкарыстоўвае мадэль кіраваных аб'ектаў для стварэння мадэлі дадзеных прыкладання.

Магчымая сітуацыя калі ў вас ёсць адразу некалькі файлаў мадэлі дадзеных. Клас NSManagedObjectModel выдатна здольны аб'яднаць некалькі мадэляў дадзеных у адзін, што з'яўляецца адной з найбольш магутных і прасунутых функцый Core Data.

Структура Core Data таксама падтрымлівае мадэляванне версій дадзеных, а таксама міграцыі. Гэта гарантуе, што дадзеныя, якія захоўваюцца ў пастаянных сховішчах, не будуць пашкоджаныя. У гэтай серыі мы раскажам аб версіях і міграцыі.

У сапраўдны момант файл мадэлі дадзеных у нашым праекце пусты, што азначае, што наша мадэль дадзеных не ўтрымлівае аб'ектаў. Мы выправім гэта ў наступным ўроку, які будзе арыентаваны выключна на мадэль дадзеных.

6. Злучаем усё разам

Перш чым мы скончым гэты артыкул, я хацеў бы паказаць вам дыяграму, якая ілюструе тры кампаненты стэка Core Data.

Вышэйпрыведзеная Дыяграма - гэта візуальнае ўяўленне таго, што мы вывучылі ў шаблоне Xcode імгненне таму. Аб'ект NSPersistentStoreCoordinator з'яўляецца мозгам стэка асноўных дадзеных прыкладання. Ён вядзе перамовы з адным ці некалькімі пастаяннымі сховішчамі і гарантуе захаванне, загрузку і кэшаванне дадзеных.

Пастаянны каардынатар сховішчы ведае аб мадэлі дадзеных, схеме графічнага аб'екта, калі хочаце, праз аб'ект NSManagedObjectModel. Мадэль кіраваных аб'ектаў стварае мадэль дадзеных прыкладання з аднаго або некалькіх файлаў .momd, двайковых уяўленняў мадэлі дадзеных.

І апошняе, але не менш важнае: дадатак звяртаецца да графу аб'ектаў праз адзін або некалькі асобнікаў класа NSManagedObjectContext. Кантэкст кіраванага аб'екта ведае аб мадэлі дадзеных праз пастаянны каардынатар сховішчы, але ён не ведае ці не падтрымлівае спасылку на мадэль кіраваных аб'ектаў. Няма неабходнасці ў гэтым злучэнні.

Кантэкст кіраваных аб'ектаў запытвае пастаянны каардынатар дадзеных і паведамляе яму, каб ён захоўваў дадзеныя, калі гэта неабходна. Усё гэта робіцца для вас базай дадзеных Core, і вашаму з дадаткам рэдка даводзіцца напрамую размаўляць з пастаянным каардынатарам крамы.

Выснова

У гэтым артыкуле мы разгледзелі ключавых гульцоў стэка Core Data, пастаяннага каардынатара сховішчы, мадэлі кіраванага аб'екта і кантэксту кіраванага аб'екта. Пераканайцеся, што вы разумееце ролю кожнага кампанента і, што больш важна, як яны працуюць разам, каб дазволіць Core Data рабіць сваю чараўніцтва.

У наступным выпуску гэтай серыі прысвечанай Core Data мы пагрузіліся ў вывучэнне мадэлі дадзеных. Мы разгледзім рэдактар ​​мадэлі дадзеных у Xcode 5, і мы ствараем некалькі сутнасцяў, атрыбутаў і адносін.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.