前言
最近開發(fā)的項(xiàng)目遇到了數(shù)據(jù)持久化的需求,由于對(duì)原生有著特殊偏愛的癖好,首先想了解的便是Core Data,遂就此整理了一下近期所學(xué)(基礎(chǔ)部分還請(qǐng)自行谷歌),希望可以幫到Core Data的初用者,不足之處還請(qǐng)各路大神多多指點(diǎn)。
Core Data簡(jiǎn)介
Core Date是ios3.0后引入的數(shù)據(jù)持久化解決方案,它是是蘋果官方推薦使用的,不需要借助第三方框架。Core Date實(shí)際上是對(duì)SQLite的封裝,提供了更高級(jí)的持久化方式。在對(duì)數(shù)據(jù)庫操作時(shí),不需要使用sql語句,也就意味著即使不懂sql語句,也可以操作數(shù)據(jù)庫中的數(shù)據(jù)。在iOS10之后,Core Data也是有了不少改進(jìn)。
一、準(zhǔn)備工作
1、創(chuàng)建工程,使用Core Data

2、創(chuàng)建一個(gè)Entity,新增一個(gè)Person,后面會(huì)使用

二、Core Data基本使用
首先:import CoreData
1、獲取NSManagerContext
func getObjectContext() -> NSManagedObjectContext {
let delegate = UIApplication.shared.delegate as! AppDelegate
let context = delegate.persistentContainer.viewContext
return context
}
2、增刪改查基本使用
- 增加數(shù)據(jù)
func insertData(name: String, age: String) {
//取得上下文
let context = getObjectContext()
//獲取之前創(chuàng)建的Person實(shí)體
let entity = NSEntityDescription.entity(forEntityName: "Person", in: context)
//獲取托管的person對(duì)象
let person = NSManagedObject(entity: entity!, insertInto: context)
//給person添加姓名、年齡
person.setValue(name, forKey: "name")
person.setValue(age, forKey: "age")
//執(zhí)行存儲(chǔ)
do {
try context.save()
//成功
} catch {
print(error)
//失敗
}
}
- 刪除數(shù)據(jù)
func removeData(name: String, age: String) {
let context = getObjectContext()
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Person")
//設(shè)置查找條件
let condition = "name='\(name)'OR age='\(age)'"
let predicate = NSPredicate(format: condition, "")
fetchRequest.predicate = predicate
do {
let fetchResults = try context.fetch(fetchRequest)
guard fetchResults.count > 0 else {
print("未找到數(shù)據(jù)")
return
}
for result in fetchResults as! [NSManagedObject] {
context.delete(result)
}
//刪除之后不要忘記save
try context.save()
print("刪除成功")
} catch {
print(error)
//失敗
}
這里的condition設(shè)置了匹配名字或年齡的條件"name='\(name)'OR age='\(age)'"
其他的條件用法:
判斷字符串首字母是否為字母
let condition = "SELF MATCHES %@", "^[A-Za-z].+"
比較運(yùn)算符>,<,==,>=,<=,!=,可用于數(shù)值及字符串
let condition = "number > 100"
范圍運(yùn)算符:IN、BETWEEN
let condition = "number BETWEEN {1,5}"`
let condition = "address IN {'shanghai','beijing'}"`
字符串本身:SELF
let condition = "SELF == 'APPLE'"
字符串相關(guān):BEGINSWITH、ENDSWITH、CONTAINS
//包含某個(gè)字符串
let condition = "content CONTAINS[cd] 'ang'"
//以某個(gè)字符串開頭
let condition = "content BEGINSWITH[c] 'sh'"
//以某個(gè)字符串結(jié)束
let condition = "content ENDSWITH[d] 'ang'"
注:[c]不區(qū)分大小寫[d]不區(qū)分發(fā)音符號(hào)即沒有重音符號(hào)[cd]既不區(qū)分大小寫,也不區(qū)分發(fā)音符號(hào)。
通配符:LIKE
//代表通配符
let condition = "content LIKE[cd] 'er'"
let condition = "content LIKE[cd] '???er'"
正則表達(dá)式:MATCHES
//以A開頭,e結(jié)尾
let regex = "^A.+e$"
let condition = "name MATCHES %@",regex
- 改數(shù)據(jù)
func updateData(name: String) {
let context = getObjectContext()
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Person")
let condition = "name='\(name)'"
let predicate = NSPredicate(format: condition, "")
fetchRequest.predicate = predicate
do {
let fetchResults = try context.fetch(fetchRequest)
guard fetchResults.count > 0 else {
print("未找到數(shù)據(jù)")
return
}
for result in fetchResults as! [NSManagedObject] {
result.setValue("Developer", forKey: "name")
}
try context.save()
print("修改成功")
} catch {
print(error)
}
}
此處示例,是通過匹配name后批量修改為"Developer",程序內(nèi)寫死了,只為演示,至于實(shí)際中按需求發(fā)揮O(∩_∩)O哈哈~
- 查詢數(shù)據(jù)
func queryData() {
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Person")
//此處未設(shè)置查詢條件,默認(rèn)取所有數(shù)據(jù)
do {
let context = getObjectContext()
let fetchResults = try context.fetch(fetchRequest)
for result in fetchResults {
let name = result.value(forKey: "name")!
let age = result.value(forKey: "age")!
print("name: \(name), age: \(age)")
}
//成功
} catch {
print(error)
//失敗
}
}
本章Demo下載
以上是本人的一些簡(jiǎn)單總結(jié),也是剛學(xué),不對(duì)之處還請(qǐng)各位看客多多留言指正,再此謝過!后續(xù)有時(shí)間會(huì)繼續(xù)更新...