SobjectiveRecord 是 HobjectiveRecord 的 Swift 版本,支持 Xcode 6.3。
HobjectiveRecord 受 ObjectiveRecord 启发并针对背景 NSManagedObjectContext
进行了定制。
在您使用之前,我建议您阅读以下文章
SobjectiveRecord
文件夹中的所有文件复制到您的项目中。pod 'SobjectiveRecord'
您应该使用支持 Swift 的 CocoaPods 版本 0.36
有关详细信息,请参阅 Pod Authors Guide to CocoaPods Frameworks
设置您的存储。
import SobjectiveRecord // when using CocoaPods
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
NSPersistentStoreCoordinator.setupDefaultStore()
// your code here
return true
}
您的实体必须具有前缀(例如 projectName.entityName)
您可以方便地对模型的 typealias 进行操作
// User, Tweet are NSManagedObject's subclass
typealias Users = SobjectiveRecord<User>
typealias Tweets = SobjectiveRecord<Tweet>
// so, it's same
var user = SobjectiveRecord<User>.create()
var user = Users.create()
使用 performBlock
NSManagedObjectContext.defaultContext.performBlock {
// your code here
}
var moc = NSManagedObjectContext.defaultContext.createChildContext()
moc.performBlock {
// your code here
}
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 {
Tweets.deleteAll()
NSManagedObjectContext.defaultContext.save()
}
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)
}
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)
}
NSManagedObjectContext.defaultContext.performBlock {
var allUserCount = Users.count()
var englishUserCount = Users.count(condition: "lang == 'en'")
}
NSManagedObjectContext.defaultContext.performBlock {
Users.batchUpdate(condition: "friendsCount > 10", propertiesToUpdate: ["friendsCount": 0])
// update all entities
Users.batchUpdate(propertiesToUpdate: ["friendsCount": 100])
}
NSManagedObjectContext.defaultContext.performBlock {
var frc = Users.createFetchedResultsController(order: "name")
frc.delegate = self
var error: NSError? = nil
if frc.performFetch(&error) {
self.reloadData()
}
}
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)
}
如果您已手动添加 Core Data,则可以更改自定义模型和数据库名称。
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
等。
您的 Swift 实现的属性具有大驼峰式命名 - firstName
、lastName
。
大驼峰式命名自动受支持 - 您不需要做任何事情!否则,如果您有更复杂的映射,可以这样操作
!! 日期、可转换类型和关系不支持 !!
// just override +mappings in your NSManagedObject subclass
extension User
{
override class var mappings: [String: String]? {
return ["description" : "userDescription"]
}
}
// first_name => firstName is automatically handled
SobjectiveRecord 支持CoreData的内存存储。在任何地方,在测试开始运行之前,只需调用
NSPersistentStoreCoordinator.setupDefaultStore(useInMemoryStore: true)
SobjectiveRecord 在MIT许可下可用。有关更多信息,请参阅LICENSE文件。