swift支持多线程操作数据库类库-CoreDataManager
来源:互联网 发布:身体域网络的作用范围 编辑:程序博客网 时间:2024/04/28 09:20
类库方法
获取数据executeFetchRequest(request:)
同步获取数据
var request: NSFetchRequest = NSFetchRequest(entityName: "MonkeyEntity") var myMonkeys:NSArray? = CoreDataManager.shared.executeFetchRequest(request)
异步获取数据
executeFetchRequest(request:, completionHandler:)
Fetches with a completionHandler that returns an array with results asynchronously.
var myMonkeys:NSArray? var request: NSFetchRequest = NSFetchRequest(entityName: "MonkeyEntity") CoreDataManager.shared.executeFetchRequest(request) { results in myMonkeys = results! }
保存方法save()
Saves the context, it doesn't matters the thread.
CoreDataManager.shared.save()
删除方法deleteEntity(object:)
Deletes the NSManagedObject sent
CoreDataManager.shared.deleteEntity(item as MonkeyEntity)
源码地址:https://github.com/mdelamata/CoreDataManager-Swift
CoreDataManagaer-swift代码
import Foundation import CoreDataclass CoreDataManager: NSObject {let storeName="dev-db.sqlite"let dataModelName="Model"var _managedObjectContext:NSManagedObjectContext?=nilvar _managedObjectModel:NSManagedObjectModel?=nilvar _persistentStoreCoordinator:NSPersistentStoreCoordinator?=nilclass var shared:CoreDataManager{ get{ struct Static{ static var instance:CoreDataManager?=nil static var token:dispatch_once_t = 0 } dispatch_once(&Static.token){ Static.instance=CoreDataManager() } return Static.instance! }}var managedObjectContext:NSManagedObjectContext{ if NSThread.isMainThread() { if !(_managedObjectContext != nil){ let coordinator = self.persistentStoreCoordinator if coordinator != NSNull() { _managedObjectContext=NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType) _managedObjectContext!.persistentStoreCoordinator=coordinator } return _managedObjectContext! } }else{ var threadContext:NSManagedObjectContext?=NSThread.currentThread().threadDictionary["NSManagedObjectContext"] as? NSManagedObjectContext; if threadContext==nil{ threadContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) threadContext!.parentContext = _managedObjectContext threadContext!.name=NSThread.currentThread().description NSThread.currentThread().threadDictionary["NSManagedObjectContext"] = threadContext NSNotificationCenter.defaultCenter().addObserver(self, selector: "contextWillSave", name: NSManagedObjectContextWillSaveNotification, object: threadContext) } else{ print("using old context") } return threadContext!; } return _managedObjectContext!}// Returns the managed object model for the application.// If the model doesn't already exist, it is created from the application's model.var managedObjectModel:NSManagedObjectModel{ if !(_managedObjectModel != nil){ let modelURL=NSBundle.mainBundle().URLForResource(dataModelName, withExtension: "momd") _managedObjectModel=NSManagedObjectModel(contentsOfURL: modelURL!) } return _managedObjectModel!}var persistentStoreCoordinator:NSPersistentStoreCoordinator{if !(_persistentStoreCoordinator != nil){ let storeURL=self.applicationDocumentsDirectory.URLByAppendingPathComponent(storeName) //var error:NSError?=nil _persistentStoreCoordinator=NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) do { try _persistentStoreCoordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: self.databaseOptions()) } catch _ as NSError { //error = error1 abort() } } return _persistentStoreCoordinator!;} // #pragma mark - fetchesfunc executeFetchRequest(request:NSFetchRequest)->Array<AnyObject>?{ var results:Array<AnyObject>? self.managedObjectContext.performBlockAndWait{ var fetchError:NSError? do { results=try self.managedObjectContext.executeFetchRequest(request) } catch let error as NSError { fetchError = error results = nil } catch { fatalError() }; if let error=fetchError{ print("Warning!! \(error.description)") } } return results;}func executeFetchRequest(request:NSFetchRequest,completionHandler:(results:Array<AnyObject>?) -> Void){ self.managedObjectContext.performBlock(){ var fetchError:NSError? var results:Array<AnyObject>? do { results=try self.managedObjectContext.executeFetchRequest(request) } catch let error as NSError { fetchError = error results = nil } catch { fatalError() } if let error=fetchError { print("Warning!! \(error.description)") } completionHandler(results: results) }}func save(){ let context:NSManagedObjectContext = self.managedObjectContext if context.hasChanges { context.performBlock{ var saveError:NSError? let saved: Bool do { try context.save() saved = true } catch let error as NSError { saveError = error saved = false } catch { fatalError() }; if !saved { if let error = saveError{ print("Warning!! Saving error \(error.description)") } } if (context.parentContext != nil) { context.parentContext!.performBlockAndWait{ var saveError:NSError? let saved: Bool do { try context.parentContext!.save() saved = true } catch let error as NSError { saveError = error saved = false } catch { fatalError() } if !saved{ if let error = saveError{ print("Warning!! Saving parent error \(error.description)") } } } } } }}func contextWillSave(notification:NSNotification){ let context : NSManagedObjectContext! = notification.object as! NSManagedObjectContext let insertedObjects:NSSet = context.insertedObjects; if insertedObjects.count != 0 { var obtainError:NSError? do { try context.obtainPermanentIDsForObjects(insertedObjects.allObjects as! [NSManagedObject]) } catch let error as NSError { obtainError = error } if let error = obtainError { print("Warning!! obtaining ids error \(error.description)") } }}func deleteEntity(object:NSManagedObject){ object.managedObjectContext?.deleteObject(object)}func deleteTable(tableName:String){ let managedObjectContext=self.managedObjectContext; let entity=NSEntityDescription.entityForName(tableName, inManagedObjectContext: managedObjectContext) let request=NSFetchRequest() request.includesPropertyValues=false; request.entity=entity; let items=self.executeFetchRequest(request); if (items != nil&&items!.count>0) { for obj in items! { let item = obj as! NSManagedObject; self.deleteEntity(item) } self.save() }}// #pragma mark - Application's Documents directory// Returns the URL to the application's Documents directory.var applicationDocumentsDirectory: NSURL {let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) // println(urls[urls.endIndex-1] as NSURL) return urls[urls.endIndex-1] }func databaseOptions() -> Dictionary <String,Bool> { var options = Dictionary<String,Bool>() options[NSMigratePersistentStoresAutomaticallyOption] = true options[NSInferMappingModelAutomaticallyOption] = true return options} }
0 0
- [Swift 开发] swift支持多线程操作数据库类库-CoreDataManager
- swift支持多线程操作数据库类库-CoreDataManager
- iOS 修改FMdatabase,不使用FMDatabaseQueue支持多线程数据库操作
- 自己写简单CoreDataManager封装对CoreData操作
- QT数据库封装类-支持多线程
- Swift 操作数据库
- JAVA多线程数据库操作
- JAVA多线程数据库操作
- 多线程操作数据库
- 多线程操作数据库 (CoreData)
- 多线程操作数据库
- 多线程操作数据库 (CoreData)
- 多线程操作数据库
- 多线程操作数据库
- 多线程操作数据库 (CoreData)
- 多线程操作数据库
- 多线程同步操作数据库
- 多线程操作数据库
- spark RDD的5个重要内部属性
- 没有庸俗的企业,只有不停的战场
- python---学习链接
- mybatis批量插入
- Android Gradle Plugin指南(二)——基本项目
- swift支持多线程操作数据库类库-CoreDataManager
- 颜色的三要素:色调,饱和度,和亮度。
- python之scipy
- Java虚拟机(四):Class文件结构及字节码指令
- test
- 颜色的三要素:色调,饱和度,和亮度 HSI/HSV
- react-native遇到的坑,及解决方法
- SpringMVC-轻松上手
- 3-内核对象