【Swift】CoreData的使用
阅读原文时间:2023年07月10日阅读:2

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("测试读取")

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章