CoreData存储
2021-12-23 本文已影响0人
gale_小米
1.CoreData存储
测试中遇到的error
Multiple commands produce
'/UITestDemo2.build/Debug-iphoneos/UITestDemo2.build/Objects-normal/arm64/Student2+CoreDataClass.o':
1) Target 'UITestDemo2' (project 'UITestDemo2') has compile command for Swift source files
新版本的Xcode 里面不在需要再创建 NsManagerObject subclass,移除掉对应的文件就可以
代码创建
import Foundation
import CoreData
/**
* 代码创建 CoreDataStack
*/
class CoreDataStack : NSObject
{
let contex : NSManagedObjectContext
let coordinator : NSPersistentStoreCoordinator
let model : NSManagedObjectModel
let store : NSPersistentStore?
private static let defult = CoreDataStack()
static func defultStack() -> CoreDataStack {
return defult
}
private override init() {
//构建模型
let bundle = Bundle.main
let modelUrl : URL = bundle.url(forResource: "UITestDemo2", withExtension: "momd")!
self.model = NSManagedObjectModel(contentsOf: modelUrl)!
//持久化存储助理
self.coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
//获取上下文
self.contex = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType)
self.contex.persistentStoreCoordinator = self.coordinator
//持久化存储
let manager = FileManager.default
let urls = manager.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)
let documentUrl : URL = urls.first!
let storeUrl = documentUrl.appendingPathComponent("UITestDemo2")
if #available(iOS 15.0, *) {
self.store = try! (self.coordinator.addPersistentStore(type: NSPersistentStore.StoreType.sqlite, configuration: nil, at: storeUrl, options: nil))
} else {
// Fallback on earlier versions
print(" Fallback on earlier versions ")
self.store = ( try! self.coordinator.addPersistentStore(ofType: NSSQLiteStoreType.description, configurationName: nil, at: storeUrl, options: nil))
}
}
func saveContext(){
if self.contex.hasChanges {
do{
try self.contex.save()
}catch{
print(" Saved failed... ")
}
}
}
}
demo 案例
/**
* 插入数据
*/
func installStudent3s(){
let str1 = ["a" ,"b","c" ,"d","e" ,"f","g" ,"h" ,"i" ,"j"]
let str2 = ["01","02","03","04","05","06","07","08","09","10"]
for i in 0..<100 {
let sno = "\(1000+i)"
let name = str1[ i / 10 ] + str2 [i % 10]
let score = i
self.installStudent(sno: sno, name: name, score: Int32(score))
}
CoreDataStack.defultStack().saveContext()
}
func installStudent(sno:String , name:String ,score : Int32){
let context = CoreDataStack.defultStack().contex
let student = NSEntityDescription.insertNewObject(forEntityName: "Student2", into: context) as! Student2
student.sno = sno
student.name = name
student.score = score
}
/**
* 查询数据
*/
func fetchRequestStudent3(){
let context = CoreDataStack.defultStack().contex
let request = NSFetchRequest<Student2>(entityName: "Student2")
let sort = NSSortDescriptor(key: "sno", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:)))
request.sortDescriptors = [sort]
//查询条件
//request.predicate = NSPredicate(format: "score >70 ")
//request.predicate = NSPredicate(format: " name like 'a*'")
do{
let students = try context.fetch(request)
for student in students {
print("sno=\(student.sno!.description) name=\(student.name!.description) socre=\(student.score.description)")
}
}catch{
print("---fetch failed---")
}
}
/**
* 统计数据
*/
func countStudents(){
let context = CoreDataStack.defultStack().contex
let request = NSFetchRequest<Student2>(entityName: "Student2")
request.predicate = NSPredicate(format: "score > 90")
//统计计数
request.resultType = .countResultType
do{
let entries = try context.count(for: request)
let count = entries
print("count = \(count)")
}catch{
print("fetch failed")
}
}
func averageStudentScore(){
let context = CoreDataStack.defultStack().contex
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Student2")
//指定返回结果为字典
request.resultType = .dictionaryResultType
let description = NSExpressionDescription()
description.name = "AverageScore"
let args = [ NSExpression(forKeyPath: "score") ]
/**
* forFunction 的值
* sum: 求和
* count: 统计
* min: 最小
* max: 最大
*/
description.expression = NSExpression(forFunction: "average:", arguments: args)
description.expressionResultType = .floatAttributeType //返回指定类型
//将平均值的表达式request属性
request.propertiesToFetch = [description]
do{
let enties = try context.fetch(request)
let result = enties.first! as! NSDictionary
let averageScore = result["AverageScore"]
print(" averageScore = \(averageScore!) ")
}catch{
print("fetch failed")
}
}
/**
* 修改信息
*/
func updateStudent(){
let context = CoreDataStack.defultStack().contex
let request = NSFetchRequest<Student2>(entityName: "Student2")
request.predicate = NSPredicate(format: "name like 'a*'")
do{
let students = try context.fetch(request)
for student in students {
student.score = 1005
}
}catch{
print("fetch failde")
}
CoreDataStack.defultStack().saveContext()
}
/**
* 删除数据
*/
func deleteStudent(){
let context = CoreDataStack.defultStack().contex
let request = NSFetchRequest<Student2>(entityName: "Student2")
request.predicate = NSPredicate(format: "name like 'a*'")
do{
let students = try context.fetch(request)
for student in students {
context.delete(student)
}
}catch{
print(" fetch failed ")
}
CoreDataStack.defultStack().saveContext()
}