- 参考书籍:CORE DATA by Tutorials
- 默认有swift基础。
最近一直在学习CoreData相关内容,在这里做一个总结,总结分篇组成,以供自己和他人学习参考。
Core Data 是一个在OS X和iOS SDKs中对象图形化管理以及持久化的框架。这意味着Core Data可以用来存储以及获取数据,但这并不是一个关系型数据库如同MySQL和SQLite。但是事实上Core Data使用的是SQLite来存储数据的。我的理解是Core Data是苹果对SQLite的进一步升级,使你可以不用关注数据的存储而把重心放在对象的增删改查。
这一篇主要内容:
1、使用Xcode建立CoreData模型。
2、添加数据。
3、读取数据。
(1)、建立模型
建立一个新工程,如下图所示。
注意红色选择框的勾得勾选
Note:在xcode6中只有Master-Detail Application 和Single View Application这两个模板有这个勾选框。
你会发现AppDelegate.swift文件中多出了一些代码,以及多了一个CoreDataTest1.xcdatamodeld文件。
AppDelegate.swift中多出的代码暂且不用管他,在后面我们会用到。
点击*.xcdatamodeld文件,点击Add Entity按钮添加Entity,将其重新命名为Test,在右边的Attributes栏点击加号,添加一个Attribute,并将type选择为Sring。
- Note:Entity的名字必须以大写开头
这样你就添加了一个Entity实体,叫做Test,这个实体有一个属性名为name,为String类型。在这里解释一下这几个名词的意义:
- Entity:相当于coredata中的类。
- Attribute:如果entity是类的话,attribute就是类的属性,各自为不同类型。
(还有一些其他属性在后面的章节会介绍。)
通过以上操作我们就成功的创建了一个CoreData的Model。
(2)、保存数据
为了方便演示,我们取消AutoLayout,并拖入几个UI控件,制作一个简单的Demo。
Add按钮添加数据,show按钮显示数据好的,接下来就是添加数据的相关操作。
首先,打开viewcontroller.swift,添加头文件“import CoreData”。
然后,在addButton方法内添加以下代码:
<pre><code>
//1
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
//2
let entity = NSEntityDescription.entityForName("Test", inManagedObjectContext:
managedContext)
let test = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext)
//3
let name = self.addTextField.text
test.setValue(name, forKey: "name")
//4
var error: NSError?
if !managedContext.save(&error) {
println("Could not save (error), (error?.userInfo)")
}
</code></pre>
让我来解释一下这一段代码:
-
//1 在我们想要保存或者获取任何数据之前我们必须获取NSManagedObjectContext,你可以把这个东西理解为暂存器。
(这个对象就是我们前面提到的AppDelegate中自动生成的代码之一,如果你在创建工程的时候勾选了‘Use Core Data’)
我们通过 Application.delegate 获取了xcode自动生成的‘暂存器’。 -
//2 好的,经过上一步我们拥有了一个暂存器,现在我们想保存对象的首先得创造这个对象,这个对象是NSManagedObject类型的,通过初始化方法:
init(entity:insertIntoManagedObjectContext:)
这个方法给我们的entity也就是实体创建了一个能加入到‘暂存器’中的对象。NSEntityDescription.entityForName(entityName: String, inManagedObjectContext context: NSManagedObjectContext)
这个方法按照名字寻找到我们设定的entity,并且和我们的‘暂存器’连接起来。
- //3 上一步我生成了一个NSManagedObject对象,这个对象有一个属性“name”,这一步做的就是给这个属性赋值。
test.setValue(name, forKey: "name")
key-value大家应该不会陌生。这样,我们新创建的对象的属性就有了值,这个值就是我们输入到输入框的值。
到这一步,我们的entity有了值,并且我们的entity已经进入添加到了‘暂存器’中。 - //4 我们前面一直在说存到‘暂存器’中,既然是‘暂存器’,那么最后一步就是把‘暂存器’中的东西存到磁盘中。保存的方法很简单:
managedContext.save(&error)
error是存盘发生错误时产生错误原因,一个好的app必须对各种error进行处理。
通过以上四步我们就成功将输入到TextField中的字符串存到了磁盘中
(3)、读取数据
这一部分我们的目标是将前面存入磁盘的内容再从磁盘中读出来,并在TextView中显示。
在showButton方法中添加以下代码:
<pre><code>
//1
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
//2
let fetchRequest = NSFetchRequest(entityName:"Test")
//3
var error: NSError?
let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as! [NSManagedObject]?
if let results = fetchedResults {
for each in results{
let name:String = each.valueForKey("name") as! String
self.showTextView.text = self.showTextView.text + name + "\n"
}
}else {
println("Could not fetch (error), (error!.userInfo)")
}
</code></pre>
- //1 前面已经说过,不管是储存还是读取数据,首先得获取managedObjectContext对象,获取方法与之前相同,通过Application delegate的方式获取。
- //2 想要读取数据,第二步就是告诉系统想要的读取数据的entity
let fetchRequest = NSFetchRequest(entityName:"Test")
NSFetchRequest这是对‘寄存器发出请求,告诉‘寄存器’’我们要获取数据的实体。 - //3 通过前两步,我们已经有了‘寄存器’,以及想要获取数据的实体的请求。那么这一步对‘寄存器’发出请求,就可以返回一个数组,这个数组包括了所有符合要求的实体,每一个实体都是我么之前存进去的对象。
let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as! [NSManagedObject]?
fetchedResults就是这个包含所有‘Test’对象的数组,我们用一个for in 函数将数组中的每一个对象都读出来
let name:String = each.valueForKey("name") as! String
.valueForkey(String)函数可以将对象中的属性的值读出来
- Nete:如果‘寄存器’中没有这个实体的数据,也就是数组中没有对象,那么我们获取的fetchedResults数组是这样的“[]”.
但是如果请求发生了错误,那么该方法返回的是一个nil,所以我们可以通过if let 来判断是否发生了错误,如果发生了错误我们可以输出error.userInfo来进行一个提示。
好的,我们通过以上操作就将数据读取出来并显示在了TextView中,我们来操作一下app,结果如下所示:
在上方输入框输入name,点击Add按钮就添加到了数据库中,点击show按钮就将已添加的name显示在下方的TextView中在以上内容中我们学习了这些知识点:
- data models
- entities
- attributes
- managed objects
- managed object contexts
- fetch requests.
再来总结一下:
- 储存数据:
1、获取‘暂存器’——NSManagedObjectContext。
2、声明想要储存的实体对象NSManagedObject。
用test.setValue(name, forKey: "name")方法给声明的实体对象的属性赋值
3、保存- 读取数据
1、获取‘暂存器’——NSManagedObjectContext。
2、创建请求NSFetchRequest
3、
managedContext.executeFetchRequest(fetchRequest, error: &error) as! [NSManagedObject]?
方法返回数据,该数据是一个包括所有符合要求的实体对象的数组。
如果发生错误,方法返回nil。
这一篇中我们进行了简单的存贮以及读取操作,下一篇中我们会对CoreData进行更多的操作。
源代码已上传github:https://github.com/superxlx/CoreDataTest1
网友评论
需要写成:
````
do {
fetchdResults = try managedContext.executeFetchRequest(fetchRequest) as! [NSManagedObject]
print(fetchdResults)
for each in fetchdResults {
let name:String = each.valueForKey("name") as! String
showTextView.text = showTextView.text + "\(name)"+"\r"
}
} catch let error1 as NSError {
error = error1
print("can not get \(error), \(error?.userInfo)")
}
````
这个方法可以获取沙盒地址,把它打印出来。右击Finder->前往文件,你可以找到一些 .sqlite文件。然后使用SQLite Manager – Firefox的一个图形化管理sql数据库的插件,可以查看相关数据。