swift 之CoreData使用

前端之家收集整理的这篇文章主要介绍了swift 之CoreData使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1、CoreData使用

创建一个swift语言项目 ,主要功能添加联系人,显示联系人列表,删除联系人。

1、创建数据模型 data Model,此模型用来构建数据库表,映射到实体模型。
添加一个实体 add Entity. 编辑Entity 名字(对应的类名)编辑相关属性,数据类型。


2、创建管理对象模型
创建一个 NSManagerObject Subclass 选中对应的数据模型,选择swift语言,这样自动创建了实体类

3、CoreData 核心

CoreData 通过NSManagedObjectContext 管理对象上下文操作数据库,上下文拥有持久化存储器,存储器指向数据模型(即数据库)。

创建一个类CoreDataManage用来管理获取NSManagedObjectContext、 NSPersistentStoreCoordinator、 NSManagedObjectModel
代码

<span style="font-size:18px;"></span>

import UIKit

import CoreData

class CoreDataManager: NSObject {

static let coreDataManager :CoreDataManager = CoreDataManager()

lazy var applicationDocumentsDirectory: NSURL = {

// The directory the application uses to store the Core Data store file. This code uses a directory named "com.pixolity.ios.coredata" in the application's documents Application Support directory.

let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains: .UserDomainMask)

print("\(urls[urls.count-1])")

return urls[urls.count-1] as NSURL

}()

lazy var managedObjectModel: NSManagedObjectModel = {

// The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.

let modelURL = NSBundle.mainBundle().URLForResource("Model",withExtension: "momd")!

return NSManagedObjectModel(contentsOfURL: modelURL)!

}()

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {

// The persistent store coordinator for the application. This implementation creates and return a coordinator,having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.

// Create the coordinator and store

var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)

let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("swift_demo.sqlite")

var error: NSError? = nil

var failureReason = "There was an error creating or loading the application's saved data."

do {

try coordinator!.addPersistentStoreWithType(NSsqliteStoreType,configuration: nil,URL: url,options: nil)

} catch var error1 as NSError {

error = error1

coordinator = nil

// Report any error we got.

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)

// Replace this with code to handle the error appropriately.

// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application,although it may be useful during development.

NSLog("Unresolved error \(error),\(error!.userInfo)")

abort()

} catch {

fatalError()

}

return coordinator

}()

lazy var managedObjectContext: NSManagedObjectContext = {

// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.

let coordinator = self.persistentStoreCoordinator

var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)

managedObjectContext.persistentStoreCoordinator = coordinator

return managedObjectContext

}()

// MARK: - Core Data Saving support

func saveContext () {

if managedObjectContext.hasChanges {

do {

try managedObjectContext.save()

} catch {

// Replace this implementation with code to handle the error appropriately.

// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application,although it may be useful during development.

let nserror = error as NSError

NSLog("Unresolved error \(nserror),\(nserror.userInfo)")

abort()

}

}

}


}


<span style="font-size:18px;">
</span>


联系人列表:
viewDidLoad 获取数据:
 

override func viewDidLoad() {

super.viewDidLoad()


let fetchRequst = NSFetchRequest(entityName: "Person")

let ageSort = NSSortDescriptor(key: "age",ascending: true)

let nameSort = NSSortDescriptor(key: "name",ascending: true)

fetchRequst.sortDescriptors = [ageSort,nameSort]

frc = NSFetchedResultsController(fetchRequest: fetchRequst,managedObjectContext: managerObjectContext!,sectionNameKeyPath: nil,cacheName: nil)

frc.delegate = self

do {

try frc.performFetch()

}catch let error as NSError{

print("performFetch error :\(error)")

}

self.tableView.tableFooterView = UIView(frame: CGRect(x: 0,y: 0,width: 0,height: 0))


}



实现 NSFetchedResultsController 代理方法

<span style="font-size:18px;"></span>

func controllerWillChangeContent(controller: NSFetchedResultsController) {

self.tableView.beginUpdates()

}

func controller(controller: NSFetchedResultsController,didChangeObject anObject: AnyObject,atIndexPath indexPath: NSIndexPath?,forChangeType type: NSFetchedResultsChangeType,newIndexPath: NSIndexPath?) {

if(type == .Delete){

self.tableView.deleteRowsAtIndexPaths([indexPath!],withRowAnimation: .Automatic)

}else if type == .Insert{

self.tableView.insertRowsAtIndexPaths([newIndexPath!],withRowAnimation: .Automatic)

}

}

func controllerDidChangeContent(controller: NSFetchedResultsController) {

self.tableView.endUpdates()

}


<span style="font-size:18px;"></span>


数据源:

override func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {

// #warning Incomplete implementation,return the number of rows

let sectionInfo = frc.sections![section] as NSFetchedResultsSectionInfo

return sectionInfo.numberOfObjects

}

override func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = UITableViewCell(style: .Subtitle,reuseIdentifier: TableViewConstants.cellIdentifier)

let person = frc.objectAtIndexPath(indexPath) as! Person


cell.textLabel!.text = "Name: \(person.name!)"

cell.detailTextLabel!.text = "Phone:\(person.phoneNum!)"

return cell

}



4、添加联系人

核心部分:
1、通过NSEntityDescription.insertNewObjectForEntityForName 方法向上下文插入一个对象。并返回新建的对象。
2、给新建的对象属性赋值
3、保存到数据库managerObjectContext.save()

func newPerson()->Bool{

let managerObjectContext = CoreDataManager.coreDataManager.managedObjectContext

let newPerson = NSEntityDescription.insertNewObjectForEntityForName("Person",inManagedObjectContext: managerObjectContext) as? Person

if let person = newPerson {

person.name = self.nameTextField.text

if let phoneNum = Int(self.phoneTextfield.text!){

person.phoneNum = phoneNum


}

if let age = Int(self.ageTextfield.text!){

person.age = age

}

do{

try managerObjectContext.save()

return true

}catch let error as NSError{

print("Failed to save :\(error) ")

}

}else{

print("Failed to creat new person")

}

return false

}

猜你在找的Swift相关文章