注意:html
- 实体的属性名称,首字母必须小写。咱们可使用骆驼命名法对实体的属性进行命名。
- 在生成完成Entity子类后,打开子类文件,查看子类的标题上方是否有
@objc(EntityName)
标记,若是没有,就加上。若是不加上,在使用上下文对象时,会提示找不到实体类。
由于咱们在建立项目的时候勾选了使用Use Core Data
,因此在项目中的AppDelegate.swift文件中,咱们能够看到Xcode已经完成对NSManagedObjectContext
、NSManagedObjectModel
、NSPersistentStoreCoordinator
以及用于存储的.saveContext()
方法。以下所示:sql
// MARK: - Core Data stack lazy var applicationDocumentsDirectory: NSURL = { let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) return urls[urls.count-1] as! NSURL }() lazy var managedObjectModel: NSManagedObjectModel = { let modelURL = NSBundle.mainBundle().URLForResource("CoreDataUsing", withExtension: "momd")! return NSManagedObjectModel(contentsOfURL: modelURL)! }() lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("CoreDataUsing.sqlite") var error: NSError? = nil var failureReason = "There was an error creating or loading the application's saved data." if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil, error: &error) == nil { coordinator = nil var dict = [String: AnyObject]() dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" dict[NSLocalizedFailureReasonErrorKey] = failureReason dict[NSUnderlyingErrorKey] = error error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) NSLog("Unresolved error \(error), \(error!.userInfo)") abort() } return coordinator }() lazy var managedObjectContext: NSManagedObjectContext? = { let coordinator = self.persistentStoreCoordinator if coordinator == nil { return nil } var managedObjectContext = NSManagedObjectContext() managedObjectContext.persistentStoreCoordinator = coordinator return managedObjectContext }() // MARK: - Core Data Saving support func saveContext () { if let moc = self.managedObjectContext { var error: NSError? = nil if moc.hasChanges && !moc.save(&error) { NSLog("Unresolved error \(error), \(error!.userInfo)") abort() } } }
注意:swift
- 若是在建立项目的时候没有勾选
Use Core Data
,后续可使用添加Data Model
的方式添加。可是,若是使用手工的方式添加,那么就须要手动的实如今AppDelegate
中的上述代码。
要想插入数据到持久话存储当中,根据CoreData的框架特性,咱们首先须要取得NSManagedObjectContext
对象,而后再建立想要插入的NSManagedObject
对象,并对这个对象的属性进行赋值操做,最后经过保存上下文的方式,完成持久化操做。app
打开ViewController.swift文件,而后添加下面的代码到.viewDidLoad()
方法当中。框架
override func viewDidLoad() { super.viewDidLoad() var delegate = UIApplication.sharedApplication().delegate as? AppDelegate var context = delegate?.managedObjectContext var user = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: context!) as! User user.name = "Aaron" delegate!.saveContext() }
下面的代码首先取得当前运行的应用程序的AppDelegate
,而后取得由Xcode自动生成的上下文对象。dom
var delegate = UIApplication.sharedApplication().delegate as? AppDelegate var context = delegate?.managedObjectContext
下面的代码用于新建一个NSManagedObject
实体实例,并为这个实体的属性赋值。ide
var user = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: context!) as! User user.name = "Aaron"
当咱们完成实体实例的配置后,须要保存改变,进行持久化操做。咱们可使用下面的代码。学习
delegate!.saveContext()
全部对实体的操做都须要在当前应用程序的持久化上下文环境当中,这样才可以利用持久化上下文进行数据实体的持久话操做。url
下面是从持久化数据存储提取所有“User”实体(表)的数据的方法。.net
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var delegate = UIApplication.sharedApplication().delegate as? AppDelegate var context = delegate?.managedObjectContext var request = NSFetchRequest(entityName: "User") var results = context?.executeFetchRequest(request, error: nil) as! [User] for user in results { println("\(user.name)") } }
在获取到持久化上下文以后,想要从持久化存储中提取数据,首先须要建立一个提取数据请求。
var request = NSFetchRequest(entityName: "User")
而后在上下文中执行提取数据请求,而后将请求后的结果赋值给结果对象。
var results = context?.executeFetchRequest(request, error: nil) as! [User]
在取得提取结果以后,可使用遍历等的方式,提取须要的数据结果。
for user in results { println("\(user.name)") }
要想更新数据,首先须要找到咱们须要更新的数据项目,咱们能够为数据提取请求配置查询条件(谓词,Predicate),而后执行请求取得须要更新的数据。而后直接修改数据对象的属性值。最后,调用应用程序委托对象,进行持久化上下文操做。
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var delegate = UIApplication.sharedApplication().delegate as? AppDelegate var context = delegate?.managedObjectContext var request = NSFetchRequest(entityName: "User") var predicate = NSPredicate(format: "%K like %@", argumentArray: ["name", "Aaron"]) request.predicate = predicate var aarons = context?.executeFetchRequest(request, error: nil) as! [User] for user1 in aarons { user1.name = "cong" } delegate?.saveContext() }
与更新数据相似,想要删除数据,首先要找到对应的数据,而后使用持久话上下文的.deleteObject(...)
操做对制定的数据对象执行删除操做,最后调用持久化存储操做。
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var delegate = UIApplication.sharedApplication().delegate as? AppDelegate var context = delegate?.managedObjectContext var predicate = NSPredicate(format: "%K like %@", argumentArray: ["name", "cong"]) request.predicate = predicate var aarons = context?.executeFetchRequest(request, error: nil) as! [User] for user1 in aarons { context?.deleteObject(user1) } delegate?.saveContext() }