1、前言
本文主要记录swift开发Core Data数据库相关知识,从项目搭建,到plist数据准备,再到数据库的增删改查。并且提供源码免费下载。好记性不如烂笔头,记录一下方便以后学习,毕竟是初学者,哈哈,学无止境,以后会持续不断更新。
2、环境搭建
2.1、新建CoreData工程
新建包含CoreData的工程,xCode->File->New->Project,下面一步时,记得勾选“Use Core Data”。
新建完成之后,会看到工程根目录下有个和工程名称一模一样的后缀名为"xcdatamodeld"的文件,该文件就是数据库文件。再打开工程的AppDelegate
可以看到有关该文件的全局变量和全局方法已自动生成。
// MARK: - Core Data stack
lazy var persistentContainer: NSPersistentContainer = {
//CoredataPractice为数据库文件的名称,可以修改,但必须一致。
let container = NSPersistentContainer(name: "CoredataPractice")
container.loadPersistentStores(completionHandler: {
(storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
// MARK: - Core Data Saving support
func saveContext () {
let context = persistentContainer.viewContext
if context.hasChanges {
do {
try context.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}
2.2、旧工程引入CoreData
新建时没有选择use core data,也可以随时新建数据库文件,如下:
新建的文件命名可以随意,新建完成之后,这里取名为test
,打开AppDelegate
,将上面的那段自动生成的代码加进去,特别注意NSPersistentContainer对象初始化的name必须与后缀名为xcdatamodeld
的文件名一模一样。
3、数据库文件维护
打开数据库文件,界面如下:
3.1、Entity/Attribute
点击Add Entity
,新建一个Entity,这里相当于一个数据库表。在里面增加Attribute,相当于数据库表字段。Attribute有很多种类型,如下:
除了一些常用的基本数据类型外,Transformable类型可以包含数组,字典等。选择完成数据类型之后可以对该字段做一些个性化的设置,如下图:
设置字段是否是可选,最小最大长度,默认值,或者正则表达式等等。注意如果数据库中已有数据,再要修改数据库某字段的类型,再次运行到手机上之后,程序会崩溃,需先卸载再安装,当然仅限于开发阶段。
3.2、Relationship
关联关系这个应该是经常用到的了,比如本案例,数据库表字段如下:
Cartoon动画片表
字段 | 类型 | 说明 |
---|---|---|
name | String | 动画片名称 |
Character人物角色表
字段 | 类型 | 说明 |
---|---|---|
name | String | 角色名称 |
isProtagonist | Bool | 是否主角 |
age | Int 16 | 年龄 |
remark | String | 备注 |
一部动画片对应多个人物角色。此时需要建立关联关系。在Cartoon表中建立Relationship,取名为roles
,如下图:
- Relationship命名为roles。
- Destination选择Character。
- 右边Delete Rule选择为
Cascade
,即关联删除,如果删除了这个动画片,就会同样删除动画片关联的所有人物角色。 - 右边type选为To Many即一对多。
在Character表中同样需要建立关系,这个人物所属的动画,如下图:
- Relationship命名为cartoon_name。
- Destination选择Cartoon。
- Inverse选择
roles
,即对应Cartoon表中的关系名称。 - 右边Delete Rule选择为
Nullify
,无任何关联。 - 右边type选为To One即一对一,一个人物角色只能对应一部动画片。
此时可以回到Cartoon表添加roles
关系的指向了,如下图:
至此,一个完整的关联关系建立起来了。至于如何赋值,可以参考后文5.3。
4、plist文件操作
plist文件可以给数据库预置一些数据。新建plist文件,New File->Property List(Resource)。如下:
新建完成之后,设置根节点类型,这里选为Array,Item类型选为字典
添加一些字段,及对应的数据
至此准备工作完毕。
5、数据库读写
5.1、读取plist文件数据
//该段代码是读取datalist.plist文件中的所有数据
let plistPath : String = Bundle.main.path(forResource: "datalist.plist", ofType:nil)!
let plistArray : NSArray = NSArray(contentsOfFile: plistPath)!
for item in plistArray {
let itemDict: [String: Any] = item as! [String : Any]
print(item)
}
5.2、数据库增查方法