本文将演示使用开源类库实现CoreData数据的增删改查。
首先确保在项目中已经安装了所需的第三方库。
点击【Podfile】,查看安装配置文件。
1 platform :ios, '12.0' 2 use_frameworks! 3 4 target 'AERecordDemo' do 5 source 'https://github.com/CocoaPods/Specs.git' 6 pod 'AERecord' 7 end
根据配置文件中的相关配置,安装第三方库。
然后点击打开【DemoApp.xcworkspace】项目文件。
项目已经引入的数据持久化框架。
点击【AERecordeDemo.xcdatamodeld】文件
->点击添加实体图表,创建一个新的实体。
->输入实体的名称:People
->按下【Enter】完成实体名称的输入。
->给实体添加一个新的属性,
扫描二维码关注公众号,回复:
5017498 查看本文章
->【Attris】->【+】
->输入属性的名称:【name】,选择属性的类型:【String】
->【Attris】->【+】
->输入属性的名称:【age】,选择属性的类型:【Integer 16】
->【Attris】->【+】
->输入属性的名称:【favorite】,选择属性的类型:【String】
在项目文件夹【AppDemo】点击鼠标右键,弹出右键菜单,以创建一个基于管理对象的子类。
->【New File】->【Cocoa Touch】->【Next】->
【Class】:People
【Subclass of】:NSManagedObject
【Language】:Swift
->【Next】->【Create】
编写实体类【People.swift】
1 import UIKit 2 //引入需要用到的类库 3 import CoreData 4 5 //添加一个标识符, 6 //系统会自动给所有非私有的属性和成员,都加上该标识符。 7 //从而使旧的编程语言可以自由调用此处的类和属性。 8 @objc(People) 9 //创建一个继承自管理对象的类。 10 class People: NSManagedObject { 11 12 //添加被管理的属性, 13 //这些属性的名称和视图的属性相同。 14 @NSManaged var name: String 15 @NSManaged var age: Int 16 @NSManaged var favorites: String 17 18 }
在项目导航区,打开视图控制器的代码文件【ViewController.swift】
1 import UIKit 2 //引入已经安装的第三方类库 3 import AERecord 4 import CoreData 5 6 class ViewController: UIViewController { 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // Do any additional setup after loading the view, typically from a nib. 11 //加载数据存储堆栈 12 loadCoreDataStack() 13 //插入一些数据 14 addData() 15 //查询插入的数据 16 requestData() 17 //在数据库中查找不同的数据 18 filterValues() 19 //在数据库中查找不同属性的记录 20 filterRecords() 21 //实现对数据的修改操作 22 updateRecords() 23 //实现对数据的删除操作 24 deleteRecords() 25 //删除数据存储堆栈 26 destroyCoreDataStack() 27 } 28 29 //添加一个方法,用来加载数据存储堆栈 30 func loadCoreDataStack() 31 { 32 //通过一个异常捕捉语句, 33 do 34 { 35 //加载数据存储堆栈。 36 try AERecord.loadCoreDataStack() 37 } 38 catch 39 { 40 print(error) 41 } 42 } 43 44 //添加一个方法,用来插入一些数据 45 func addData() 46 { 47 //创建自定义类的初始化方法, 48 //创建四个对象,并设置对象的属性的值。 49 People.create(with: ["name": "Jerry", "age" : 21, "favorites" : "smile"]) 50 People.create(with: ["name": "John", "age" : 32, "favorites" : "smile"]) 51 People.create(with: ["name": "Peter", "age" : 43, "favorites" : "smile"]) 52 People.create(with: ["name": "Jerry", "age" : 21, "favorites" : "smile"]) 53 //通过调用第三方类库的类方法,保存刚刚创建的四条数据 54 AERecord.saveAndWait() 55 } 56 57 //添加一个方法,用来查询刚刚创建的四条数据, 58 //在本方法中,对刚刚保存的数据进行检索。 59 func requestData() 60 { 61 //初始化一个谓词对象,并设置检索的条件, 62 //这里设置从数据库中检索年龄大于30的数据。 63 let predicate = NSPredicate(format: " age >= 30 ", "") 64 //在控制台输出所有的数量 65 print("People.count():\(People.count())") 66 //在控制台输出,根据条件进行检索的数据数量。 67 print("People.count(with: predicate):\(People.count(with: predicate))") 68 69 //通过第三方类库提供的方法,可以获得数据库中的第一条数据。 70 print("People.first():\(String(describing: People.first()))") 71 //同时可以指定检索时的排序依据, 72 //这里设置年龄进行升序排序,并获得排序后的第一条数据。 73 print("orderedBy\(String(describing: People.first(orderedBy: "age")))") 74 75 //根据谓词条件检索数据,并返回第一条符合条件的数据。 76 print("predicate):\(String(describing: People.first(with: predicate)))") 77 78 //获得所有的数据,并将返回的数据,存储在一个数组中。 79 let array = People.all() 80 //对数组进行遍历操作,并在控制台输出遍历的元素。 81 for obj in array! 82 { 83 print(obj) 84 } 85 } 86 87 //添加一个方法,在数据库中查找不同的数据 88 func filterValues() 89 { 90 //添加一个异常捕捉语句, 91 //用来执行数据的检索操作。 92 do 93 { 94 //通过获取不同值的方法,获得数据中不同的名称。 95 let array = try People.distinctValues(for: "name") 96 print(array as Any) 97 } 98 catch 99 { 100 print(error) 101 } 102 } 103 104 //添加一个方法,在数据库中查找不同属性的记录 105 func filterRecords() 106 { 107 //初始化一个数组,表示名称和年龄两个属性。 108 let attributes = ["name", "age"] 109 //添加一个异常捕捉语句,用来执行数据的检索操作。 110 do 111 { 112 //通过获取不同记录的方法, 113 //获得在数据中,拥有不同名称和年龄的记录。 114 let array = try People.distinctRecords(for: attributes) 115 print(array as Any) 116 } 117 catch 118 { 119 print(error) 120 } 121 } 122 123 //添加一个方法,实现对数据的修改操作。 124 func updateRecords() 125 { 126 //通过批量更新的方法,可以对大量数据进行相同的编辑操作。 127 //此条语句将修改所有记录的名称属性的值 128 let result = People.batchUpdate(properties: ["name" : "John"]) 129 130 //初始化一个谓词对象,用来过滤需要更新的记录。 131 let predicate = NSPredicate(format: " age >= 30 ", "") 132 //再次调用批量更新的方法,获取年龄大于30的记录, 133 //并将这些记录的年龄修改为50. 134 let result2 = People.batchUpdate(properties: ["age" : 50], predicate: predicate, resultType: .statusOnlyResultType, in: AERecord.Context.default) 135 //在控制台输出批量更新方法的结果。 136 print("result:\(String(describing: result))") 137 print("result2:\(String(describing: result2))") 138 139 //调用第三方类库的保存并等待方法 140 AERecord.saveAndWait() 141 142 //执行两条批量更新的语句 143 filterRecords() 144 } 145 146 //添加一个方法,实现对数据的删除操作。 147 func deleteRecords() 148 { 149 //输出所有数据总的数量。 150 print(People.all()?.count ?? 0) 151 //调用删除全部方法,可以删除指定条件的数据。 152 People.deleteAll(with: "name", value: "Peter") 153 //调用第三方类库的保存并等待方法,执行此条删除语句。 154 AERecord.saveAndWait() 155 //再次输出所有数据总的数量。比较前后的变化。 156 print(People.all()?.count ?? 0) 157 158 //调用删除全部方法,可以删除所有的数据。 159 People.deleteAll() 160 AERecord.saveAndWait() 161 print(People.all()?.count ?? 0) 162 } 163 164 //添加一个方法,删除数据存储堆栈 165 func destroyCoreDataStack() 166 { 167 //添加一个异常捕捉语句 168 do 169 { 170 //通过调用第三方类库的方法,删除数据堆栈。 171 //之前存储的所有数据都将被清除。 172 try AERecord.destroyCoreDataStack() 173 print("---destroyCoreDataStack") 174 } 175 catch 176 { 177 print(error) 178 } 179 } 180 181 override func didReceiveMemoryWarning() { 182 super.didReceiveMemoryWarning() 183 // Dispose of any resources that can be recreated. 184 } 185 }