// 이후 이건 동등 var user = SobjectiveRecord<User>.create() var user = Users.create()
기본적으로 모든 처리는 performBlock:안에 기술
1 2 3 4 5 6 7
NSManagedObjectContext.defaultContext.performBlock { // your code here } var moc = NSManagedObjectContext.defaultContext.createChildContext() moc.performBlock { // your code here }
Create / Save / Delete
1 2 3 4 5 6 7 8 9 10 11 12 13
NSManagedObjectContext.defaultContext.performBlock { var t = Tweets.create() t.text = "I am here" t.save() t = Tweets.create(attributes: ["text" : "hello!!", "lang" : "en"]) t.delete() }
NSManagedObjectContext.defaultContext.performBlock { var tweets = Tweets.all() var tweetsInEnglish = Tweets.find(condition: "lang == 'en'") var hmhv = Users.first(condition: "screenName == 'hmhv'") var englishMen = Users.find(condition: ["lang" : "en", "timeZone" : "London"]) var predicate = NSPredicate(format: "friendsCount > 100") var manyFriendsUsers = Users.find(condition: predicate) }
Order and Limit
1 2 3 4 5 6 7 8 9 10 11 12 13
NSManagedObjectContext.defaultContext.performBlock { var sortedUsers = Users.all(order: "name") var allUsers = Users.all(order: "screenName ASC, name DESC") // or var allUsers2 = Users.all(order: "screenName A, name D") // or var allUsers3 = Users.all(order: "screenName, name d") var manyFriendsUsers = Users.find(condition: "friendsCount > 100", order: "screenName DESC") var fiveEnglishUsers = Users.find(condition: "lang == 'en'", order: "screenName ASC", fetchLimit: 5) }
Aggregation
1 2 3 4 5
NSManagedObjectContext.defaultContext.performBlock { var allUserCount = Users.count() var englishUserCount = Users.count(condition: "lang == 'en'") }
// update all entities Users.batchUpdate(propertiesToUpdate: ["friendsCount": 100]) }
NSFetchedResultsController
1 2 3 4 5 6 7 8 9
NSManagedObjectContext.defaultContext.performBlock { var frc = Users.createFetchedResultsController(order: "name") frc.delegate = self var error: NSError? = nil if frc.performFetch(&error) { self.reloadData() } }
Custom ManagedObjectContext
1 2 3 4 5 6 7 8 9 10 11 12 13
var childContext = NSManagedObjectContext.defaultContext.createChildContext()
childContext.performBlock { var john = Users.create(context: childContext) john.name = "John" john.save() var savedJohn = Users.first(condition: "name == 'John'", context: childContext) var manyFriendsUsers = Users.find(condition: "friendsCount > 100", order: "screenName DESC", context: childContext) var allUsers = Users.all(context: childContext) }
커스텀 모델, 커스텀 sqlite파일의 이용
1 2 3 4 5 6
var modelURL = NSURL.defaultModelURL(modelName: "model_name") NSPersistentStoreCoordinator.setupDefaultStore(modelURL: modelURL)
// or var storeURL = NSURL.defaultStoreURL(fileName: "file_name.sqlite") NSPersistentStoreCoordinator.setupDefaultStore(storeURL: storeURL)
맵핑
웹 서비스로 부터의 JSON은 first_name, last_name과 같은 스네이크 케이스인 경우가 많지만, Objective-C에서는 firstName, lastName과 같은 캐멀 케이스가 주류다. 그래서 스네이크 케이스에서 캐멀 케이스로의 맵핑은 자동으로 됩니다. 그외에 특별한 이름 맵핑이 필요한 경우는 각 모델 클래스에서 mappings을 오버라이드에서 설정가능.
!! Date, Transformable 타입 및 Relationships은 맵핑 대상외 입니다. !!
1 2 3 4 5 6 7 8
// just override +mappings in your NSManagedObject subclass extensionUser { overrideclassvarmappings: [String: String]? { return ["description" : "userDescription"] } } // first_name => firstName 은 자동으로 맵핑됨
테스트
HobjectiveRecord은 메모리내 스토어를 설정가능합니다. 테스트 이용에 편리합니다.