日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

swift中使用core data

發(fā)布時間:2025/4/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 swift中使用core data 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在創(chuàng)建了.xcdatamodeld文件之后,需要創(chuàng)建相關(guān)的model,之后便是初始化CoreData。一般使用的是NSManagedObjectModel、NSManagedObjectContext、NSPersistentStoreCoordinator。 swift中創(chuàng)建單例:

static let shared:CoreDataManager = {let instance = CoreDataManager()return instance}() 復制代碼

首先,創(chuàng)建model: 根據(jù)文件名字來創(chuàng)建model: //創(chuàng)建model對象,model需要momd

var managedObjectModel:NSManagedObjectModel{if !(_managedObjectModel != nil){let modelURL = Bundle.main.url(forResource: dataModelName, withExtension: "momd")_managedObjectModel = NSManagedObjectModel(contentsOf: modelURL!)}return _managedObjectModel!} 復制代碼

之后是創(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樣式的存儲try _persistentStoreCoordinator!.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: storeURL, options: self.databaseOptions())}catch _ as NSError{abort()}}return _persistentStoreCoordinator!} 復制代碼

最后是創(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(){//主隊列的context_managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)_managedObjectContext!.persistentStoreCoordinator = coordinator}return _managedObjectContext!}}else{var threadContext:NSManagedObjectContext? = Thread.current.threadDictionary["NSManagedObjectContext"] as? NSManagedObjectContextif threadContext == nil {//非主隊列的contextthreadContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)//設置parentthreadContext!.parent = _managedObjectContext//設置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!} 復制代碼

對于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} 復制代碼

或者帶回調(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)}} 復制代碼

保存數(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)")}}}}}}} 復制代碼

context存儲時:

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)")}}} 復制代碼

刪除某一個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()}} 復制代碼

以上是對CoreData的初始化,在具體到某一個Model的時候,需要再進行封裝: 有數(shù)據(jù)轉(zhuǎn)化(獲取的數(shù)據(jù)轉(zhuǎn)成對應的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} } 復制代碼

總結(jié)

以上是生活随笔為你收集整理的swift中使用core data的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。