Slide 1

Slide 1 text

Realm The$First$Swi$%Op(mized$Database

Slide 2

Slide 2 text

Making compile()me*type*safety play%nice%with run$me'magic

Slide 3

Slide 3 text

What%is%Realm? • Fast,&zero+copy,&embedded&database • Used&in&apps&with&millions&of&users • NoSQL • Full&ACID&transacBons • Well&defined&threading&model • Cross+plaForm&C++&core&with&many&language&bindings" (currently"Objec/ve1C,"Swi7"&"Android)

Slide 4

Slide 4 text

Open%Source* github.com/realm/realm&cocoa *"Bindings"100%"open"source,"C++"core"will"launch"as"Apache"2

Slide 5

Slide 5 text

Core%Data%in%Swi- Core%Data%goes%against%Swi/'s%strong%type%safety%and%generics% features. let myPersonClass: AnyClass = NSClassFromString("MyGreatApp.Person")

Slide 6

Slide 6 text

Apple%had%to%invent%special%language% constructs%in%Swi5%to%support%Core% Data!!

Slide 7

Slide 7 text

Like%the%@dynamic%a)ribute%in% Objec1ve3C,%the%@NSManaged% a)ribute%informs%the%Swi<%compiler% that%the%storage%&%implementa1on% of%a%property%will%be%provided%at% run1me.

Slide 8

Slide 8 text

Managed'context'in'Core'Data @lazy var managedObjectContext: NSManagedObjectContext = { let modelURL = NSBundle.mainBundle().URLForResource("SwiftTestOne", withExtension: "momd") let mom = NSManagedObjectModel(contentsOfURL: modelURL) ZAssert(mom != nil, "Error initializing mom from: \(modelURL)") let psc = NSPersistentStoreCoordinator(managedObjectModel: mom) let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) let storeURL = (urls[urls.endIndex-1]).URLByAppendingPathComponent("SwiftTestOne.sqlite") var error: NSError? = nil var store = psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error) if (store == nil) { println("Failed to load store") } ZAssert(store != nil, "Unresolved error \(error?.localizedDescription), \(error?.userInfo)\nAttempted to create store at \(storeURL)") var managedObjectContext = NSManagedObjectContext() managedObjectContext.persistentStoreCoordinator = psc return managedObjectContext }()

Slide 9

Slide 9 text

TOOLS

Slide 10

Slide 10 text

Swi$Data Simple'and'Effec.ve'SQLite'Handling'in'Swi6 github.com/ryanfowler/Swi5Data Made%by%Ryan%Fowler,%@ryanfowler19 if let err = SD.createTable("Cities", withColumnNamesAndTypes: ["Name": .StringVal, "Population": .IntVal]) { //there was an error during this function, handle it here } else { //no error, the table was created successfully }

Slide 11

Slide 11 text

QueryKit Swi$%CoreData%query%language querykit.org Made%by%Kyle%Fuller,%@kylef Person.queryset(context).filter(Person.name == "Kyle").delete() // Filtering queryset.filter(Person.name == "Kyle") queryset.exclude(Person.age < 21) queryset.exclude(Person.isEmployed)

Slide 12

Slide 12 text

Realm&in&Swi+ • Generics • Type+Safety • Default+Values • Swi5+Objects • No+Code+Genera=on • Zero+Copy

Slide 13

Slide 13 text

Realm&Models class Employee: Object { dynamic var name = "" // you can specify defaults dynamic var startDate = NSDate() dynamic var salary = 0.0 dynamic var fullTime = true } class Company: Object { dynamic var name = "" dynamic var ceo: Employee? // optional. who needs CEO's?! let employees = List() }

Slide 14

Slide 14 text

Using&Realm let company = Company() // Using Realm Objects company.name = "Realm" // etc... defaultRealm().write { // Transactions defaultRealm().add(company) } // Queries let companies = objects(Company) companies[0].name // => Realm (generics) let ftJacks = objects(Employee) // "Jack"s who work full time .filter(.fullTime == true && .name == "Jack")

Slide 15

Slide 15 text

Realm Under&the&hood

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

Thou%shalt%do no evil

Slide 18

Slide 18 text

Thou%shalt%do no a"convenient"amount"of evil

Slide 19

Slide 19 text

Evil!things!Realm!does 1.#Introspec-ng#Swi2#from#Swi2#(!) 2.#Introspec-ng#Swi2#from#ObjC#(!) 3.#Overriding#property#accessors#(!) 4.#Emoji#proper,es#in#ObjC#(!) 5.#Generic#proper,es#in#ObjC#(!❗)

Slide 20

Slide 20 text

another()me...

Slide 21

Slide 21 text

Resources • This&talk&(github.com) • Realm&on&GitHub&(github.com) • Realm's&WIP&Swi:&branch&(github.com) • Wri=ng&Swi:&Classes&With&Objec=veCC&Behavior&(apple.com) • The&Core&Data&Stack&in&Swi:&(cimgf.com)

Slide 22

Slide 22 text

Thank&You!

Slide 23

Slide 23 text

Meetup().questions?.askThem! JP#Simard,#@simjp,#realm.io