Realm-tietokantaopas – Muistiinpanosovelluksen rakentaminen Swiftillä iOS:lle

Jos pidät enemmän videoista kuin kirjoitetuista artikkeleista, tämä artikkeli on kirjallinen versio tuottamastani videosta. Sisältö on identtinen.

Tämä video on ensimmäinen osa sarjasta, jonka toivon palvelevan sinua opettamaan iOS:n kehysten ja työkalujen, kuten Siri Shortcutsin ja CloudKitin, käyttöä. Jos sinulla on jokin tietty kehys tai ominaisuus, jota haluaisit tämän sarjan käsittelevän, voit vapaasti kirjoittaa minulle osoitteeseen jordanosterbergshadowsystemstech tai Twitterissä @josterbe1.

Sisällysluettelo

  1. Sisällysluettelo
  2. Riippuvuuksien asentaminen
  3. Malli
  4. Realmin toteuttaminen
  5. Loppupäätelmä

Pidemmittä puheitta katsomme sovellusta, jonka aiomme rakentaa tässä sarjassa…

Johdanto

Sovelluksen muistiinpanoluettelo
Muistiinpanon muokkaaminen yksitellen

Meillä on muistiinpanoluettelomme, ja kun näpäytämme yhtä muistiinpanoa, voimme lukea sitä ja aloittaa muokkaamisen tai poistaa sen. Aika yksinkertaista. Huomaat, jos lataat aloitusprojektin, että muistiinpanot eivät säily, kun siirryt NoteDetailControllerista sisään ja ulos, kun napautat ”Apple Park Visit” -muistiinpanoa. Toisin sanoen muistiinpanon sisältö ei tallennu, kun muokkaat sitä.

Sen rakennamme tässä artikkelissa Realm-tietokannan avulla. Olen käyttänyt Realmia vain noin kaksi vuotta, ja mielestäni sen yksinkertaisuus on tärkeämpää kuin kolmannen osapuolen kirjaston käyttämisestä aiheutuvat kustannukset. Itse asiassa käytän sitä sovelluksessa, johon käytän suurimman osan henkilökohtaisesta kehitystyöstäni (ks. https://countdowns.download) sekä macOS:ssä että iOS:ssä.

Riippuvuuksien asentaminen

Aloittaaksemme Realmin käytön, meidän täytyy asentaa se CocoaPodsin avulla. CocoaPods, jos et ole tietoinen, CocoaPods on riippuvuuksien hallintatyökalu, joka on laajalti käytössä iOS:ssä. Jos CocoaPodsia ei ole vielä asennettu Macille, voit käyttää komentoa sudo gem install cocoapods aloittaaksesi. Avaa nyt projektikansio sekä Terminal-ikkuna tuon hakemiston sisällä.

Kirjoita pod init ja sitten open Podfile.

Uuden luodun ”Pod-tiedoston” sisälle on kirjoitettava tekstiä, joka ilmoittaa CocoaPodsille, mitä kirjastoja haluat asentaa projektiisi.

Kirjoita # Pods for NotesApp alapuolelle nämä kaksi riviä:

pod 'Realm', '~> 3.12.0'pod 'RealmSwift', '~> 3.12.0'

Podfilesi pitäisi näyttää samankaltaiselta kuin tämä, kun olet kirjoittanut nämä rivit:

platform :ios, '12.0'target 'NotesApp' do use_frameworks! # Pods for NotesApp pod 'Realm', '~> 3.12.0' pod 'RealmSwift', '~> 3.12.0' target 'NotesAppTests' do inherit! :search_paths end target 'NotesAppUITests' do inherit! :search_paths endend

Nyt kun olemme lisänneet riippuvuutemme, pyydetään CocoaPodsia asentamaan ne pod install

Tämä vie jonkin aikaa, kun käytät CocoaPodsia ensimmäistä kertaa. Älä huoli, CocoaPods lataa vain joitain alustavia komponentteja. Tämä ei tapahdu joka kerta, kun pod install.

Terminaali-ikkunasi näyttää tältä, kun tuo komento on suoritettu loppuun:

Terminaali-ikkuna

Tämän jälkeen, jos olet jo avannut NotesApp.xcodeproj, sulje se. Kun käytät CocoaPodia, sinun on käytettävä .xcworkspace-tiedostoa oletustiedoston .xcodeproj sijasta. Avaa NotesApp.xcworkspace-tiedosto ja siirry kohtaan Note.swift.

The Model

Tämä luokka sisältää Note-malliobjektimme, joka sisältää muutamia perusominaisuuksia:

class Note { var identifier: String var content: String var lastEdited: Date init( identifier: String = UUID().uuidString, content: String, lastEdited: Date = Date()) { self.identifier = identifier self.content = content self.lastEdited = lastEdited }}

Tavanomaista mallikoodia, mitään erikoista ei tapahdu tässä.

Meillä on samassa tiedostossa myös Note-oliomme laajennus, joka on aliluokka protokollana nimeltään Writeable

extension Note: Writable { func write(dataSource: DataSource) { self.lastEdited = Date() dataSource.store(object: self) } func delete(dataSource: DataSource) { dataSource.delete(object: self) }}

Funktioiden write ja delete sisällä huomaat, että meillä on ominaisuus DataSource. DataSource on geneerinen protokolla, joka auttaa tekemään datan muokkaamisesta mahdollisimman abstraktia koodimme ylemmillä tasoilla.

Tässä on protokollan määritelmä:

protocol DataSource { func store<T>(object: T) func delete<T>(object: T)}

Jos geneerisyys ei ole sinulle tuttua, jokaisella funktiollamme on T-parametri, joka tarkoittaa periaatteessa sitä, että se voi olla minkä tahansa tyyppinen objekti. Tätä ei käytetä kovin paljon projektissamme, mutta sitä voitaisiin kehittää ja käyttää edelleen useiden DataSourcen luomiseen, joilla on erilaisia rajoituksia sen suhteen, mitä objekteja ne voivat tallentaa.

Toteutamme DataSource-protokollamme NoteDataSource:ssä. Tässäkään ei ole mitään erikoista, lukuun ottamatta yhtä pientä nippelitietoa, jonka haluan huomioida selityksen vuoksi.

Kun store tai delete objekteja, käytämme seuraavaa kutsua NotificationCenter:lle:

NotificationCenter.default.post(name: .noteDataChanged, object: nil)// We also have this extension of Notification.Name to make sending and receiving this notification simple.extension Notification.Name { static let noteDataChanged = Notification.Name(rawValue: "noteDataChanged")}

Vähemmän sanottuna aina kun jokin muistiinpano tallennetaan tai poistetaan, ilmoitamme kaikille kuuntelijoillemme, että tietojemme on muuttunut, jotta he voivat päivittää käyttöliittymänsä vastaavasti.

Kun kaikki mallitiedostot ja luokat on saatu pois tieltä, aletaan toteuttaa Realm!

Realmin toteuttaminen

Realmin integroiminen projektiimme tapahtuu kolmessa vaiheessa:

  1. Realm-olion luominen
  2. Realm-oliomme ja primitiivisen Note-oliomme välinen yhteys
  3. Aloitetaan tietojen hakeminen ja muokkaaminen Realmilla

Realm-olion luominen

Tämä vaihe on suhteellisen yksinkertainen. Luodaan uusi Swift-tiedosto nimeltä RealmNote.swift. Tuodaan RealmNote.swift:n sisälle RealmSwift-kehys ja luodaan luokkadeklaraatio näin:

import RealmSwiftclass RealmNote: Object {}

Aliluokitellaan Realmin Object-luokka, jonka avulla voimme käyttää RealmNote:ää Realm-tietokantatoiminnoissa.

Lisäämme nyt ne kolme ominaisuutta, jotka meillä on Note-mallissamme:

@objc dynamic var identifier: String = ""@objc dynamic var content: String = ""@objc dynamic var lastEdited: Date = Date()

Muuttuja-ilmoituksemme @objc dynamic-kappaleet paljastavat ominaisuutemme Objective-C:lle, jolla monet Realmin iOS-kerroksista on kirjoitettu. Sen avulla Realm voi myös kuunnella muutoksia RealmNote-objekteihimme.

Lopettaaksemme luokkamme, ohita class func primaryKey, joka palauttaa valinnaisen merkkijonon (String?), jonka arvo on ”identifier”. Tämä ilmoittaa Realmille, että RealmNote:n primääriavain, tapa yksilöidä objektejamme yksiselitteisesti, on tallennettu ”identifier”-ominaisuuteen.

Kun olet suorittanut nämä vaiheet, RealmNote-luokkasi näyttää tältä:

class RealmNote: Object { @objc dynamic var identifier: String = "" @objc dynamic var content: String = "" @objc dynamic var lastEdited: Date = Date() override class func primaryKey() -> String? { return "identifier" }}

Ensimmäinen vaihe riittää.

Silta Realm-objektimme ja primitiivisen Note-objektimme välille,

Olemme saaneet käyttöönimme kaksi erillistä malliobjektia: Note ja RealmNote. RealmNote-objektia käytetään sisäisesti, kun ollaan tekemisissä Realm-objektin kanssa, jotta mallikerroksemme pysyisi irrotettuna käyttöliittymästä. Käyttämällä kahta erillistä objektia voimme tulevaisuudessa siirtyä pois Realm-objektin käytöstä, jos tarvetta ilmenee.

Luo RealmNote.swift-tiedostossa RealmNote:

extension RealmNote {}

Luo nyt convenience initlaajennuksen sisälle convenience init, joka ottaa ainoaksi ominaisuudekseen Note. Näin voimme luoda RealmNote-objekteja käyttämällä Note-objektia.

convenience init(note: Note) { self.init() self.identifier = note.identifier self.content = note.content self.lastEdited = note.lastEdited}

Hienoa, nyt viimeistelläksesi RealmNote.swift, luo Note-muuttuja laajennuksen sisälle, joka alustetaan RealmNote:stä:

var note: Note { return Note(realmNote: self)}

Älä huolehdi, jos Xcode antaa virheen Note:n alustajasta, korjataan se kohta.

Siirry osoitteeseen Note.swift, jonne kirjoitamme kohta sillan toisen puoliskon. Tämä koodi on periaatteessa sama kuin RealmNote:n laajennus.

extension Note { convenience init(realmNote: RealmNote) { self.init(identifier: realmNote.identifier, content: realmNote.content, lastEdited: realmNote.lastEdited) } var realmNote: RealmNote { return RealmNote(note: self) }}

Hienoa, siinä on vaihe kaksi. Voimme nyt käyttää RealmNote:ää Note:stä ja Note:ää RealmNote:stä. Tämä tarkoittaa myös sitä, että tämä koodi on täysin kelvollinen:

Note(content: "Example").realmNote.note.realmNote.note.realmNote.note.realmNote// and so on...

Vitsit sikseen, viimeistelemme sovelluksemme vaiheeseen kolme.

Aloitetaan tietojen hakeminen ja muokkaaminen Realmilla

Suuntautukaa NoteDataSource.swift:iin ja import RealmSwift:iin ennen luokkadeklaraatiota. Ennen kuin muokkaamme, poistamme ja haemme Realm-objekteja, tarvitsemme Realm-tietokannan instanssin. Korvaa NoteDataSource:n init tällä:

var realm: Realminit() { // Load our data self.realm = try! Realm()}

Tämä luo Realm-tietokannan instanssin. Tuotannossa et todennäköisesti halua käyttää bang (!)-operaattoria instanssin luomisessa, koska sovelluksesi kaatuu, jos tietokanta ei ole käytettävissä.

Muutetaan seuraavaksi store-funktiota, jotta voimme oikeasti tallentaa objekteja tietokantaamme.

Kirjoittaminen Realmilla on yksinkertaista:

try? self.realm.write {}

Tässä koodilohkossa voimme päivittää objekteja tietokannassa. Kirjoita tämä:

self.realm.add(note.realmNote, update: true)

Tämä joko luo uuden RealmNote tietokantaan tai päivittää olemassa olevan, jos sellainen on olemassa. Siinä kaikki! Tallennamme nyt objekteja Realm-tietokantaan (muistiinpanon kirjoitustoiminnon kutsuminen suoritetaan NoteDetailController.swift:ssä, jos haluat nähdä funktion, jota todella käytetään tämän kirjoituksen suorittamiseen)

Kirjoitetaan nyt delete-funktiomme. Koska kirjoitimme sillan (kysymättä Realmilta aina, kun luomme RealmNote:n Note:stä), meidän on haettava objekti suoraan tietokannasta käyttäen muistiinpanon tunnusta eikä sen realmNote-ominaisuutta.

Tämä on yksinkertaista:

if let realmNote = self.realm.object(ofType: RealmNote.self, forPrimaryKey: note.identifier) {}

Tässä pyydetään Realmia hakemaan RealmNote-objekti tietokannasta, jonka tunniste eli primääriavain on note.identifier.

Tämä voi olla hiukan funkkis. Jostain syystä sovellus kaatuu, jos käytämme perinteistä write-funktiota Realmille. Väistötoimenpiteenä tämä koodi on täysin kelvollinen ja suorittaa periaatteessa saman tehtävän kuin write:

self.realm.beginWrite()self.realm.delete(realmNote)try? self.realm.commitWrite()

Aloitamme kirjoituksemme, poistamme objektin ja vahvistamme kirjoituksemme.

Siten olemme rakentaneet toimivan muistiinpanosovelluksen!

Johtopäätökset

Toivottavasti nautit tästä oppaasta, jossa kerrotaan, miten Realm-tietokantaa käytetään. Minulla on ollut hauskaa sen tekemisessä, enkä malta odottaa, että voin kehittää tätä sarjaa ja lisätä sovellukseemme ajan mittaan lisää ominaisuuksia, kuten Siri Shortcuts, CloudKit ja paljon muuta. Kiitos lukemisesta.

Vastaa

Sähköpostiosoitettasi ei julkaista.