swift中使用core data
在創(chuàng)建了.xcdatamodeld文件之后,需要?jiǎng)?chuàng)建相關(guān)的model,之后便是初始化CoreData。一般使用的是NSManagedObjectModel、NSManagedObjectContext、NSPersistentStoreCoordinator。 swift中創(chuàng)建單例:
static let shared:CoreDataManager = {let instance = CoreDataManager()return instance}() 復(fù)制代碼首先,創(chuàng)建model: 根據(jù)文件名字來創(chuàng)建model: //創(chuàng)建model對(duì)象,model需要momd
var managedObjectModel:NSManagedObjectModel{if !(_managedObjectModel != nil){let modelURL = Bundle.main.url(forResource: dataModelName, withExtension: "momd")_managedObjectModel = NSManagedObjectModel(contentsOf: modelURL!)}return _managedObjectModel!} 復(fù)制代碼之后是創(chuàng)建coordinator: 根據(jù)Model創(chuàng)建coordinator: //初始化coordinator,需要model
var persistentStoreCoordinator:NSPersistentStoreCoordinator{if !(_persistentStoreCoordinator != nil) {let storeURL = self.applicationDocumentsDirectory.appendingPathComponent(storeName)_persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)do{//sqlite樣式的存儲(chǔ)try _persistentStoreCoordinator!.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: storeURL, options: self.databaseOptions())}catch _ as NSError{abort()}}return _persistentStoreCoordinator!} 復(fù)制代碼最后是創(chuàng)建Context: 需要使用coordinator創(chuàng)建Context: //context初始化
var managedObjectContext:NSManagedObjectContext{//創(chuàng)建context,context需要coordinatorif Thread.isMainThread{if !(_managedObjectContext != nil){let coordinator = self.persistentStoreCoordinatorif coordinator != NSNull(){//主隊(duì)列的context_managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)_managedObjectContext!.persistentStoreCoordinator = coordinator}return _managedObjectContext!}}else{var threadContext:NSManagedObjectContext? = Thread.current.threadDictionary["NSManagedObjectContext"] as? NSManagedObjectContextif threadContext == nil {//非主隊(duì)列的contextthreadContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)//設(shè)置parentthreadContext!.parent = _managedObjectContext//設(shè)置namethreadContext!.name = Thread.current.descriptionThread.current.threadDictionary["NSManagedObjectContext"] = threadContextNotificationCenter.default.addObserver(self, selector: #selector(CoreDataManager.contextWillSave(_:)), name: NSNotification.Name.NSManagedObjectContextWillSave, object: threadContext)}else{print("using old context")}return threadContext!}return _managedObjectContext!} 復(fù)制代碼對(duì)于CoreData中數(shù)據(jù)的處理,有刪除和修改,添加,更新,查詢等: 查詢:
func executeFetchRequest(_ request:NSFetchRequest<NSFetchRequestResult>) -> Array<NSFetchRequestResult>? {var results:Array<NSFetchRequestResult>?self.managedObjectContext.performAndWait {var fetchError:NSError?do{results = try self.managedObjectContext.fetch(request)}catch let error as NSError{fetchError = errorresults = nil}catch {fatalError()};if let error = fetchError{print("Warning!! \(error.description)")}}return results} 復(fù)制代碼或者帶回調(diào)的查詢:
func executeFetchRequest(_ request:NSFetchRequest<NSFetchRequestResult>,completionHanlder:@escaping (_ results:Array<NSFetchRequestResult>?) -> Void) {self.managedObjectContext.perform(){var fetchError:NSError?var results:Array<NSFetchRequestResult>?do{results = try self.managedObjectContext.fetch(request)}catch let error as NSError{fetchError = errorresults = nil}catch{fatalError()}if let error = fetchError {print("Warning!! \(error.description)")}completionHanlder(results)}} 復(fù)制代碼保存數(shù)據(jù):
func save() {let context:NSManagedObjectContext = self.managedObjectContextif context.hasChanges{context.perform {var saveError:NSError?let saved:Booldo{try context.save()saved = true}catch let error as NSError{saveError = errorsaved = false}catch {fatalError()};if !saved{if let error = saveError{print("Warning!! Saving error \(error.description)")}}if context.parent != nil{context.parent!.performAndWait {var saveError:NSError?let saved:Booldo{try context.parent!.save()saved = true}catch let error as NSError{saveError = errorsaved = false}catch {fatalError()}if !saved{if let error = saveError{print("Warning!! Saving parent error \(error.description)")}}}}}}} 復(fù)制代碼context存儲(chǔ)時(shí):
func contextWillSave(_ notification:Notification) {let context:NSManagedObjectContext! = notification.object as! NSManagedObjectContextlet insertedObjects:NSSet = context.insertedObjects as NSSetif insertedObjects.count != 0 {var obtainError:NSError?do{try context.obtainPermanentIDs(for: insertedObjects.allObjects as! [NSManagedObject])}catch let error as NSError{obtainError = error}if let error = obtainError{print("Warnning!! obtain ids error \(error.description)")}}} 復(fù)制代碼刪除某一個(gè)model的數(shù)據(jù):
func deleteEntity(_ object:NSManagedObject) {object.managedObjectContext?.delete(object)}func deleteTable<ResultType:NSFetchRequestResult>(request:NSFetchRequest<ResultType>,tableName:String) {let managedObjectContext = self.managedObjectContextlet entity = NSEntityDescription.entity(forEntityName: tableName, in: managedObjectContext)let request = NSFetchRequest<NSFetchRequestResult>()request.includesPropertyValues = falserequest.entity = entitylet items = self.executeFetchRequest(request)if (items != nil && items!.count > 0){for obj in items! {let item = obj as! NSManagedObjectself.deleteEntity(item)}self.save()}} 復(fù)制代碼以上是對(duì)CoreData的初始化,在具體到某一個(gè)Model的時(shí)候,需要再進(jìn)行封裝: 有數(shù)據(jù)轉(zhuǎn)化(獲取的數(shù)據(jù)轉(zhuǎn)成對(duì)應(yīng)的model)、獲取數(shù)據(jù)、保存數(shù)據(jù),添加數(shù)據(jù),刪除數(shù)據(jù)等;需要用到剛才初始化的CoreDataManager:
import Foundation import CoreData import SwiftyJSON class ArticleDal: NSObject {func addList(_ items:[AnyObject]) {for po in items{self.addArticle(po,save:false)}CoreDataManager.shared.save()}func addArticle(_ obj:AnyObject,save:Bool) {let context = CoreDataManager.shared.managedObjectContextlet model = NSEntityDescription.entity(forEntityName: "Article", in: context)let article = Article(entity: model!, insertInto: context)if model != nil{self.obj2ManagedObject(obj,article:article)if save {CoreDataManager.shared.save()}}}func deleteAll() {CoreDataManager.shared.deleteTable(request: NSFetchRequest<Article>(), tableName: "Article")}func save() {let context = CoreDataManager.shared.managedObjectContextdo{try context.save()}catch _{}}func getList() -> [AnyObject]? {let request:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Article")let sort1 = NSSortDescriptor(key: "articleId", ascending: false)request.fetchLimit = 30request.sortDescriptors = [sort1]request.resultType = .dictionaryResultTypelet result = CoreDataManager.shared.executeFetchRequest(request)return result}func obj2ManagedObject(_ obj:AnyObject,article:Article) {var data = JSON(obj)let articleId = data["articleId"].int64!let title = data["title"].string!let content = data["content"].stringlet createDate = data["createDate"].int64!let viewCount = data["viewCount"].int64!let siteId = data["siteId"].int64!let sourceName = data["sourceName"].stringlet sourceUrl = data["sourceUrl"].stringlet author = data["author"].stringlet language = data["language"].stringlet imageUrl = data["imageUrl"].stringarticle.articleId = articleIdarticle.title = title;article.content = content;article.createDate = createDatearticle.siteId = siteIdarticle.sourceName = sourceNamearticle.viewCount = viewCountarticle.sourceUrl = sourceUrlarticle.author = authorarticle.language = languagearticle.imageUrl = imageUrl} } 復(fù)制代碼總結(jié)
以上是生活随笔為你收集整理的swift中使用core data的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [CareerCup] 11.1 Mer
- 下一篇: [JQuery] jQuery选择器