Created
July 11, 2016 19:43
-
-
Save pronebird/26b06ed9dc122208bca0eee11f95157f to your computer and use it in GitHub Desktop.
Sample CoreData Playground with relationships
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Playground is where kids play biatch | |
import CoreData | |
@objc(City) | |
class City: NSManagedObject { | |
@NSManaged var name: String | |
@NSManaged var streets: NSSet | |
} | |
@objc(Street) | |
class Street: NSManagedObject { | |
@NSManaged var name: String | |
@NSManaged var city: City | |
} | |
var streetEntity = NSEntityDescription() | |
streetEntity.name = "Street" | |
streetEntity.managedObjectClassName = "Street" | |
var streetNameAttribute = NSAttributeDescription() | |
streetNameAttribute.name = "name" | |
streetNameAttribute.attributeType = NSAttributeType.StringAttributeType | |
streetNameAttribute.optional = false | |
streetNameAttribute.indexed = true | |
var cityEntity = NSEntityDescription() | |
cityEntity.name = "City" | |
cityEntity.managedObjectClassName = "City" | |
var nameAttribute = NSAttributeDescription() | |
nameAttribute.name = "name" | |
nameAttribute.attributeType = NSAttributeType.StringAttributeType | |
nameAttribute.optional = false | |
nameAttribute.indexed = true | |
var streetsRelation = NSRelationshipDescription() | |
var inverseStreetRelation = NSRelationshipDescription() | |
streetsRelation.destinationEntity = streetEntity | |
streetsRelation.name = "streets" | |
streetsRelation.minCount = 0 | |
streetsRelation.maxCount = 0 | |
streetsRelation.optional = true | |
streetsRelation.deleteRule = .CascadeDeleteRule | |
streetsRelation.inverseRelationship = inverseStreetRelation | |
inverseStreetRelation.destinationEntity = cityEntity | |
inverseStreetRelation.name = "city" | |
inverseStreetRelation.minCount = 0 | |
inverseStreetRelation.maxCount = 1 | |
inverseStreetRelation.optional = true | |
inverseStreetRelation.deleteRule = .NullifyDeleteRule | |
inverseStreetRelation.inverseRelationship = streetsRelation | |
cityEntity.properties = [nameAttribute, streetsRelation] | |
streetEntity.properties = [ streetNameAttribute, inverseStreetRelation ] | |
var model = NSManagedObjectModel() | |
model.entities = [cityEntity, streetEntity] | |
var persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: model) | |
let url = NSURL(fileURLWithPath: "database.sqlite") | |
// destroy store on each run | |
try persistentStoreCoordinator.destroyPersistentStoreAtURL(url, withType: NSSQLiteStoreType, options: nil) | |
do { | |
try persistentStoreCoordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil) | |
} | |
catch { | |
print("error creating psc: \(error)") | |
} | |
var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType) | |
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator | |
for i in 0 ..< 5 { | |
for j in 0 ..< 5 { | |
if i == 4 && j > 1 { | |
continue | |
} | |
let city = City(entity: cityEntity, insertIntoManagedObjectContext: managedObjectContext) | |
let street = Street(entity: streetEntity, insertIntoManagedObjectContext: managedObjectContext) | |
street.name = "Street in City \(i)" | |
city.name = "City \(i)" | |
city.streets = NSSet(object: street) | |
} | |
} | |
try! managedObjectContext.obtainPermanentIDsForObjects(Array(managedObjectContext.insertedObjects)) | |
do { | |
_ = try managedObjectContext.save() | |
} | |
catch let error as NSError { | |
print("Error: \(error)") | |
} | |
let fetchRequest = NSFetchRequest(entityName: "City") | |
let nameExpr = NSExpression(forKeyPath: "name") | |
let countExpr = NSExpressionDescription() | |
let countVariableExpr = NSExpression(forVariable: "count") | |
countExpr.name = "count" | |
countExpr.expression = NSExpression(forFunction: "count:", arguments: [ nameExpr ]) | |
countExpr.expressionResultType = .Integer64AttributeType | |
fetchRequest.resultType = .DictionaryResultType | |
fetchRequest.sortDescriptors = [ NSSortDescriptor(key: "name", ascending: true) ] | |
fetchRequest.propertiesToGroupBy = [ "name" ] | |
fetchRequest.propertiesToFetch = [ "name", countExpr ] | |
fetchRequest.havingPredicate = NSPredicate(format: "%@ > 1", countVariableExpr) | |
let results = try! managedObjectContext.executeFetchRequest(fetchRequest) | |
print("\(results)") | |
for dict in results { | |
let cityName = dict["name"] as! String | |
let count = dict["count"] as! Int | |
print("\(cityName) has \(count) duplicates") | |
let fetchRequest = NSFetchRequest(entityName: "City") | |
let result = try? managedObjectContext.executeFetchRequest(fetchRequest) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment