Persistenta bazei de date bazata pe proiectie in Swift

PersistDB este un software de calitate alfa. In prezent are o serie de limitari.

  1. Valorile de baza
  2. Prezentare generala
    1. Definiti modele
    2. Definiti o proiectie
    3. Creati un magazin
    4. preluati sau observati date
    5. Mutati cu actiuni
  3. Instalare
  4. Licenta

Valorile de baza

  • Siguranta de tip : erorile in timpul compilarii previn erorile in timpul rularii

  • Concurenta : este greu sa blochezi un fir fara API-uri sincrone

  • Coerenta : datele vizualizate ar trebui sa fie intotdeauna coerente pe plan intern

  • Semantica valorica : datele pot fi transmise prin fire, transformate si testate cu usurinta

  • Erori tipizate : verificarea exhaustivitatii previne esecurile pe calea trista

Prezentare generala

ORM-urile traditionale mapeaza un rand dintr-un tabel SQL direct pe un obiect. Fiecare proprietate de pe obiect reprezinta fie o coloana din tabel, fie o relatie.

PersistDB defineste schemele ca un ORM traditional. Dar datele sunt preluate ca o proiectie , la fel ca o interogare GraphQL. Acest lucru garanteaza ca datele incarcate vor fi coerente.

Fiecare operatiune – inserarea, stergerea sau modificarea datelor – poate fi reprezentata printr-o valoare . Acest lucru face posibila scrierea codului fara efecte secundare, facilitand testarea.

Consultati directorul Exemple pentru a vedea cum arata in practica. In special, uitati-va la modele, teste si controlere de vizualizare.

1. Definiti modele

Schemele sunt definite folosind tipurile Swift. Aceste tipuri nu sunt instantiate niciodata, dar sunt utilizate pentru a filtra, sorta si interoga baza de date. Acestea sunt adesea definite ca clase finale, astfel incat Swift sa poata construi planuri de memorie pentru relatii individuale.

final class Book {let id: ID <Book> let title: String let author: Author init (id: Int, title: String, author: Author) {self.id = id self.title = title self.author = author} } final class Author {let id: ID <Author> let name: String let books: Set <Book> init (id: Int, name: String, books: Set <Book>) {self.id = id self.name = nume self.books = carti}}

Dupa ce ati creat tipurile, le puteti declara Modele si puteti construi Schema pentru tipul respectiv. Acest lucru se face intr-un mod sigur de tip, folosind initierea tipului si caile inteligente Swift.

extension Book: PersistDB.Model {static let schema = Schema (Book.init, \ .id ~ “id”, // Sirurile de aici sunt numele pe care coloanele \ .title ~ “title”, // le vor avea in database. \ .author ~ “author”)} extension Author: PersistDB.Model {static let schema = Schema (Author.init, \ .id ~ “id” \ .name ~ “name”, \ .books ~ \ Book. autor)}

2. Definiti o proiectie

Dupa ce ati creat modelele, puteti crea proiectii, care sunt modul in care incarcati informatii din baza de date. O proiectie seamana cu un model de vizualizare: are datele pe care doriti sa le prezentati intr-un context dat.

struct BookViewModel {let title: String let authorName: String let authorBookCount: Int} extension BookViewModel: ModelProjection {static let projection = Projection <Book, BookViewModel> (BookViewModel.

edurne follando mi vecina desnuda
porno incesto real peliculas porno travestis
tv porno peliculas porno de incesto en español
mamas cachondas maduras impresionantes
viejas tetonas maduras latex
escenas porno en cine convencional porno flash
porno con abuelas mamadas en el cine
videos gays argentinos guarras masturbandose
penes grandes se corre dentro de su prima
se follan a su mujer orgias abuelas
videos de zofilia fotos de poyas
videos travestis española pillada
putas en vic obliga a su hermana a follar
tetudas españolas cerdas com gratis
maduras españolas masturbandose maduras españolas sexo
porno sub viendo como se follan a mi mujer
taboo.com orgasmosxxx
gitanas xxx hombres corriendose
videosdeincesto se deja follar
pelis porno españolas incesto abuela y nieto

init, \ .title, \ .author.name, \ .author. books.count)}

3. Creati un magazin

Magazinul este interfata cu baza de date; este sursa tuturor efectelor secundare. Crearea unui magazin este simpla:

Store <ReadWrite> .store (at: URL (…), for: [Book.self, Author.self]) .startWithResult {result in switch result {case let .success (store):… case let .failure (error) : print (“Nu s-a incarcat magazinul: \ (eroare)”)}}

Magazinele pot fi incarcate numai asincron, astfel incat firul principal sa nu poata fi blocat accidental.

4. preluati sau observati date

Seturile de obiecte sunt preluate cu Querys, care utilizeaza Predicates pentru a filtra modelele disponibile si SortDescriptors pentru a le sorta.

let harryPotter: Query <None, Book> = Book.all .filter (\. author.name == “JK Rowling”) .sort (by: \ .title)

Preluarile reale se fac cu o proiectie.

store // Un `ReactiveSwift.SignalProducer` care preia datele .fetch (harryPotter) // Fa ceva matricea sau eroarea .startWithResult {rezulta in comutarea rezultatului {case let .success (resultSet): … case let .failure (error) ):…}}

De asemenea, puteti observa obiectul (obiectele) pentru a primi valori actualizate daca se fac modificari:

store .observe (harryPotter) .startWithResult {rezulta in …}

PersistDB ofera tabel pentru a va ajuta sa creati interfete UI de colectie. Include diferente inteligente incorporate pentru a va ajuta cu actualizari incrementale.

5. Mutati cu actiuni

Inserarile, actualizarile si stergerile sunt toate construite pe tipuri de valori: Inserare, Actualizare si Stergere. Acest lucru faciliteaza testarea faptului ca actiunile tale vor avea efectul corect, fara a incerca sa verifice efectele secundare reale.

Inserarea si actualizarea sunt construite pe ValueSet: un set de valori care pot fi atribuite unei entitati model.

struct Task {public let id: UUID public let createdAt: Data public var text: String public var url: URL? functii statice publice newTask (text: String, url: URL? = nil) -> Insert <Task> {return Insert ([\ Task.id == .uuid (), \ Task.createdAt == .now, \ Task. text == text, \ Task.url == url,])}} store.insert (Task.newTask (text: “Expediati !!!”))

PersistDB include TestStore, ceea ce face mai usoara testarea insertiilor si actualizarilor in functie de interogari pentru a verifica daca au setat proprietatile potrivite.

Instalare

Cel mai simplu mod de a adauga PersistDB la proiectul dvs. este cu Carthage. Urmati instructiunile de acolo.

Licenta

PersistDB este disponibil sub licenta MIT.