iOS CoreData(Swift版本)

本文深入解析Swift Core Data框架的核心概念、关键类及其用法,并详细介绍了如何在多线程环境中安全有效地使用Core Data进行数据管理。包括如何添加CoreData文件、建立数据模型、增删查改操作的实现,以及如何通过Swift实现Core Data的多线程并发访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:

1.CoreData是对SQLite的面向对象的封装

2.CoreData框架提供的是对象-关系映射(Object-relation map)功能,即CoreData能够将对象转化成数据,然后保存到SQLite数据库文件,也可以将数据库中的数据直接在查询的时候返回对象,数据库操作语句使用的是NSPredicate类(类似SQL语句)

重要的类:

NSEntityDescription,从数据库的表名映射而来的对象,即,数据库中的一张表,代表一个实例数据模型,就是这个类的实例

NSManagerObjectModel, 用来找到xcdatamodel文件中得对象模型

NSPersistentStoreCoordinator,用来连接到数据库,通过addPersistentStoreWithType方法

NSManagerObjectContext, 用来操作数据库,从名字可以看出他是一个上下文,那么也就需要注意多线程的问题

NSFecthRequest,顾名思义,Fetch 和 Request的,也就是将NSPredicate写出的类SQL语句编译成NSManagerObjectContext对象能执行的数据库操作请求

NSPredicate,不用怀疑,就是类SQL语句的封装


用法:

1.关于如何添加CoreData文件,以及如何建立数据模型的操作,就不赘述,

但通俗的理解,CoreData中,一个Entity就是一个表格,其中的Propery就是表格中得列,另外,关于relationship有两种“一对多,一对一”,relationship也属于Entity中得Property

2.增删查改的Swift用法

private var model:NSManagedObjectModel!

    private var context:NSManagedObjectContext!


model = NSManagedObjectModel.mergedModelFromBundles(nil)

        let psc = NSPersistentStoreCoordinator(managedObjectModel: model)

        let path = self.pathInDcoumentDirectory("data.db")

        let url = NSURL.fileURLWithPath(path)

        

        do {

            try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)

        } catch let error as NSError {

            print(error.localizedDescription)

        }

        

        

        context = NSManagedObjectContext(concurrencyType:.MainQueueConcurrencyType)

        context.persistentStoreCoordinator = psc

        context.undoManager = nil


// 以下是功能函数

func pathInDcoumentDirectory(fileName:String) ->String {

        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray

        let path = paths.lastObject as! NSString

        let filePath = path.stringByAppendingPathComponent(fileName)

        

        let fileManager = NSFileManager.defaultManager()

        if fileManager.fileExistsAtPath(filePath) {

            //

        } else {

            fileManager.createFileAtPath(filePath, contents: nil, attributes: nil)

        }

        return filePath

    }

    

    func insertDatas() {

        if NSUserDefaults.standardUserDefaults().integerForKey("Index") >= 100 {

            return;

        }

        

        var index:Int = 100

        repeat {

            

            let column = NSEntityDescription.insertNewObjectForEntityForName("Column", inManagedObjectContext: context) as! Column

            

            column.columnID = NSNumber(integer: index)

            column.columnTitle = String(index)

            let image = UIImage(named:"icon")

            column.columnIcon  = UIImagePNGRepresentation(image!)

            

            do {

                try context.save()

            }catch let error as NSError {

                print(error)

            }

        

            

            index++

        } while index < 100 + 10

        

        NSUserDefaults.standardUserDefaults().setInteger(index, forKey: "Index")

        

    }


    func fetchDatas() {

        let request = NSFetchRequest()

        let column = NSEntityDescription.entityForName("Column", inManagedObjectContext: context)

        request.entity = column

        do {

            try objects = context.executeFetchRequest(request)

        } catch let error as NSError {

            print(error.localizedDescription)

        }

        

    }

    

    func updateDatas() {

        let request = NSFetchRequest()

        let column = NSEntityDescription.entityForName("Column", inManagedObjectContext: context)

        request.entity = column

        let predicate = NSPredicate(format: "columnTitle == 101")

        request.predicate = predicate

        

        do {

            let results = try context.executeFetchRequest(request) as! [Column]

            for var i = 0; i < results.count; i++ {

                let col = results[i] as Column

                col.columnTitle = "Test"

            }

            

            do {

                try context.save()

            } catch let error as NSError {

                print(error.localizedDescription)

            }

            

            

        } catch let error as NSError {

            print(error.localizedDescription)

        }

        

        self.tableView.reloadData()

    }

    

    func deleteDatas(title:String) {

        let request = NSFetchRequest()

        let column  = NSEntityDescription.entityForName("Column", inManagedObjectContext: context)

        request.entity = column

        let predicate = NSPredicate(format: "columnTitle == '\(title)'")

        request.predicate = predicate

        do {

            let results = try context.executeFetchRequest(request) as! [Column]

            for result in results {

                context.deleteObject(result)

            }

            

            do {

                try context.save()

            } catch let error as NSError {

                print(error.localizedDescription)

            }


            

        } catch let error as NSError {

            print(error.localizedDescription)

        }

    }


关于多线程使用CoreData

推荐的做法就是每一个线程维护一个NSManagerObjectContext对象,每个NSManagedObjectContext对象实例都可以使用同一个NSPersistentStoreCoordinator实例,这个实例可以很安全的顺序访问永久存储,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁。

 ios5.0之后,为NSManagedObjectContext提供了initWithConcurrentcyType方法,其中的一个NSPrivateQueueConcurrencyType,会自动的创建一个新线程来存放NSManagedObjectContext而且它还会自动创建NSPersistentStoreCoordinator

ios5.0之前,可以用GCD来实现



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值