IOS: CoreData

本篇主要介绍IOS Swift 中CoreData的基本用法和一些自己的理解
CoreData是一个数据库框架,可以让在app上本地存储一些数据,也有数据库基本的增删改查功能
CoreData有三部分: Model, PersistentContainer, Context
首先先建一个model
在这里插入图片描述
这里我建了一个简单的模型,entity的名字是person,其中这个entity有三个属性,分别是name,age,gender

PersistentContainer
PersistentContainer我会把它想成是一个中间人,可以管理可建造CoreData object。需要注意的是peresitentContainer需要是一个lazy的var,因为当我们一开始启动app的时候,我们一般是不需要Core data的,lazy可以是当我们开始使用core data的时候,这个var就会initialize,这样可以使app更快捷, 剩下的是一些必须要的设定,如我们需要description,还需要一个storeType,这里我的storeType是一个var,因为一会之后方便我们决定我们是要存储到NSSQL里,还是NSMemory里,前者把数据是保存到app里,后者是保存在内存里,在内存中当我们关闭app时候数据可以自动删除,方便之后可以会使用unit test去测试core data是否运行

lazy var persistentContainer: NSPersistentContainer = {
    let persistentContainer = NSPersistentContainer(name: "Model")
    let description = persistentContainer.persistentStoreDescriptions.first
    description?.type = storeType
    persistentContainer.loadPersistentStores(completionHandler: { (_, _) in
    })
    return persistentContainer
}()

Context
context我把它想象成一个大类,里面有各种object,object中会有数据,这个会经常用到,所以我把它写进一个function。这里的storeType的default是SQL,当我们想改的时候就可以成为NSInMemoryType

func getContext(storeType: String = NSSQLiteStoreType) -> NSManagedObjectContext {
    let context = getPersistentContainer(storyType: storeType).viewContext
    return context
}

下面是CoreDataController完整的代码

import Foundation
import CoreData

class CoreDataController {
    
    var storeType: String!
    
    static let coreDataManager = CoreDataController()
    
    private init(){}
    
    lazy var persistentContainer: NSPersistentContainer = {
        let persistentContainer = NSPersistentContainer(name: "Model")
        let description = persistentContainer.persistentStoreDescriptions.first
        description?.type = storeType
        persistentContainer.loadPersistentStores(completionHandler: { (_, _) in
        })
        return persistentContainer
    }()
    
    func getPersistentContainer(storyType: String)-> NSPersistentContainer {
        self.storeType = storyType
        return persistentContainer
    }
    
    func getContext(storeType: String = NSSQLiteStoreType) -> NSManagedObjectContext {
        let context = getPersistentContainer(storyType: storeType).viewContext
        return context
    }
    
    func createObject<T: NSManagedObject>(entity: T.Type, storeType: String = NSSQLiteStoreType) throws -> T {
        let context = getContext()
        let entityName = String(describing: entity)
        guard let description = NSEntityDescription.entity(forEntityName: entityName, in: context) else { throw error.invalidEntityType }
        let object = T(entity: description, insertInto: context)
        return object
    }
    
    enum error: Error {
        case invalidEntityType
    }
}

我这里把coreDataController用singleton的方式来方便之后access(因为都是在用同一个model,这样会比较便捷)
值得注意的是这个createObject的function,这里我需要input我想要在哪一个entity里创建一个object,如果这个entity的名字错误,就会显示一个invalidEntityType的error,同时这里我用了generic ,这样可以方便以后用不同的type(只要是在NSManagerType的范畴以内)
在这里插入图片描述
最后在viewDidload 中运行看看,可以想像我们在创建一个object的时候,想象形成了一行数据,这样我们就可以在这一个object中添加我们想要的数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值