【Swift】CoreData的使用

CoreData只是iOS数据持久化的其中一个方法,所有数据持久化如下

1、plist文件(属性列表),通常用于储存用户设置,也zhi可以用于存储捆绑的信息;

2、preference(偏好设置),常用于保存少量数据;

3、NSKeyedArchiver(归档),将内存中的对象实例保存成binary到磁盘并且可以逆向这个过程用来保存用户操作状态等;

4、SQLite 3,使用数据库进行存储;

5、CoreData,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。

 

在新建项目时,把Use Core Data勾上

如果你创建时没勾,可以参考别人的博客,自己手动添加

 

 

由于我勾选了Use Core Data,系统帮我生成了后缀为【xcdatamodeld】的档案

单击进入后,先创建实体(添加实体),然后添加属性,最后为属性设置需要存储的类型(Type)

这里我为此实体(MyTest),添加唯一的属性testSaveInt,类型为Int(Integer 16)

我这里只添加唯一属性,这里额外推荐一篇很棒的博客,除了多属性,里面还有提到属性关联,这个属性被删了,会影响到别的东西

具体在他写的【四、逻辑与建模】,仔细看完他列举的情景,就明白我在说什么了,不过他是用objective-c写的,有点遗憾

 

接着创建一个NSManagedObject子类(点击Editor -> Create NSmanagedObject Subclass...)

然后先选择自己的项目(当初开始写app时,创建的项目名称)

最后再勾选刚刚创建的实体"MyTest"

 

创建完后,多出两个档案,分别是

MyTest+CoreDataClass.swift

MyTest+CoreDataProperties.swift(这个不用修改,它的作用是存放你刚刚添加的属性,例如前面的testSaveInt)

 

我们在【MyTest+CoreDataClass.swift】添加自己封装的方法,后续可以通过类的对象,来访问此类的一些函数

以下的代码,是对 Int 类型的变量 testSaveInt,做增删改查的动作,具体流程如下

1、使用【增】的方法,写入数据12

2、使用【】的方法,查询资料库是否有数据(for循环检验:有无用MyTest这个实体创建的资料库?)

3、使用【改】的方法,找出实体"MyTest"里,数据为12的Int,更改为38

4、使用【】的方法,查询数据是否被改变(假设第2步是成功的)

5、使用【删】的方法,资料库内,发现testSaveInt == 38 的,立刻删除

6、使用【】的方法,看看资料库内,是否都不存在数据了

import UIKit // 把这行加上
import Foundation
import CoreData

@objc(MyTest)
public class MyTest: NSManagedObject {
     
    // 获取context
    func getContext() -> NSManagedObjectContext {
        let mDelegate = UIApplication.shared.delegate as! AppDelegate
        return mDelegate.persistentContainer.viewContext
    }
    
     
    // MARK: - 【增】的功能
    func coreDataAdd(command: String) {
        switch command {
            case "测试写入": 
                let mDelegate = UIApplication.shared.delegate as! AppDelegate
                let mContext = mDelegate.persistentContainer.viewContext
                
                let newTest = NSEntityDescription.insertNewObject(forEntityName: "MyTest", into: mContext)as! MyTest
                
                newTest.testSaveInt = 12 
                
                mDelegate.saveContext()
            default:
                break
        }
    }
    
    // MARK: - 【删】的功能
    func coreDataDelete(command: String) {
        switch command {
            case "测试删除":
                // 获取上下文
                let mDelegate = UIApplication.shared.delegate as! AppDelegate
                let mContext = mDelegate.persistentContainer.viewContext
                
                // 设置查询的实体,此处的实体是MyTest
                let entity = NSEntityDescription.entity(forEntityName: "MyTest", in: mContext)
                
                // 请求实体(Fetch:取、拿来)
                let request = NSFetchRequest<MyTest>()
                request.entity = entity
                                
                do {
                    let results:[AnyObject]? = try mContext.fetch(request)
                    
                    for myTest in results as![MyTest] {
                        if myTest.testSaveInt == 38 {
                            mContext.delete(myTest)
                            mDelegate.saveContext()
                        }
                    }
                } catch  {
                    print("删除数据失败")
               }
            default:
                break
        }
    }
    
    // MARK: - 【改】的功能
    func coreDataUpdate(command: String) {
        switch command {
            case "测试修改":
                // 获取上下文
                let mDelegate = UIApplication.shared.delegate as! AppDelegate
                let mContext = mDelegate.persistentContainer.viewContext
                
                // 设置查询的实体,此处的实体是MyTest
                let entity = NSEntityDescription.entity(forEntityName: "MyTest", in: mContext)
                
                // 请求实体(Fetch:取、拿来)
                let request = NSFetchRequest<MyTest>()
                request.entity = entity        
                
                do {
                    let results:[AnyObject]? = try mContext.fetch(request)
                    
                    for myTest in results as![MyTest] {
                        if myTest.testSaveInt == 12 {
                            myTest.testSaveInt = 38
                            mDelegate.saveContext()
                        }
                    }
                } catch  {
                    print("修改数据失败")
                }
                
            default:
                break
        }
    }
    
    // MARK: - 【查】的功能
    func coreDataSearch(command: String) {
        switch command {
            case "测试读取":
                // 获取上下文
                let mContext = getContext()
                
                // 设置查询的实体,此处的实体是MyTest
                let entity = NSEntityDescription.entity(forEntityName: "MyTest", in: mContext)
                
                // 请求实体(Fetch:取、拿来)
                let request = NSFetchRequest<MyTest>()
                request.entity = entity
                                       
                do {
                    let results:[AnyObject]? = try mContext.fetch(request)
                    
                    for myTest in results as![MyTest] {
                        print("value=\(myTest.testSaveInt)")
                    }
                } catch  {
                    print("读取数据失败")
                }
                
            default:
                break
        }
    }
}

  

  

最终,在需要执行【数据持久化】的类,写上常量的申请(类的对象)

let classCoreData: MyTest = MyTest()

  

然后就可以用以下代码,愉快的调用了

classCoreData.coreDataAdd("测试写入")
classCoreData.coreDataDelete("测试删除")
classCoreData.coreDataUpdate("测试修改")
classCoreData.coreDataSearch("测试读取")

  

posted @ 2020-10-24 15:14  夜桜が舞う  阅读(1030)  评论(0编辑  收藏  举报