Core Data是一个功能强大的层,位于SQLite数据库之上,它避免了SQL的复杂性,能让我们以更自然的方式与数据库进行交互。Core Data将数据库行转换为OC对象(托管对象)来实现,这样无需任何SQL知识就能操作他们。

Core Data位于MVC设计模式中的模型层,一般需要在设备上存储结构化数据时,考虑使用SQLite或是序列化等方法,而Core Data是这两种方法的混合体,并增加了一些功能,提供了SQL强大威力,但是用起来又和序列化一样简单。Core Data能将应用程序中的对象直接保存到数据库中,无需进行复杂的查询,也无需确保对象的属性名和数据库字段名对应,这一切都由Core Data完成。

Core Data的核心——托管对象

托管对象是要存储到数据库中的对象的一种表示,可以看成是SQL记录,它通常包含一些字段,这些字段与应用程序中要存储的对象的属性进行匹配,创建托管对象后,必须将气托管到托管对象上下文中,然后才可以存储到数据库中。

托管对象上下文:

托管对象上下文包含所有的托管对象,这些托管对象已经为提交给数据库准备就绪,在托管对象上下文中,可以添加、修改和删除托管对象,这一层相当于应用程序和数据库之间的缓冲区。

托管对象表:

托管对象表描述了数据库的架构(schema),供托管对象上下文与数据库交互时使用。托管对象表包含一些列实体描述,每个实体都描述了一个数据库表,用于将托管对象映射到数据库条目。

下面来创建一个Core Data

首先要保证引入了CoreData.framwork框架到项目中,然后新建模型文件,New File——Core Data中的Data Model,然后命名为CDJournal.Xcdatamodel,这里我们做一个简单的记录流水账的程序。

接下来是定义数据库实体,选中CDJournal.Xcdatamodel文件打开表编辑器,点击添加一个名为Entry的实体,然后可以为实体添加属性并指定属性的数据类型。还可以创建其他实体,如果一个实体包含另一个实体,可通过拖放建立关系,类似于SQL外键,比如建立一个Author实体可以有多个Entry。建立实体及属性如下图:

创建完实体后必须生成表示数据库对象的类,使我们能在代码中表示实体,选择Entry实体,然后选择菜单Editor——Create NSManagedObject Subclass,点击create,就完成了。完成后可以看到工程中多了一个Entry的h和m文件,这就是Core Data模型中的实体对象。基本准备工作就完成了,如下是工程目录:

现在开始编写初始化Core Data模型的代码

首先,在AppDelegate.h中声明Core Data需要的对象,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#import <UIKit/UIKit.h>  
//引入CoreData框架  
#import <CoreData/CoreData.h>  
   
@classViewController;  
   
@interface AppDelegate : UIResponder <UIApplicationDelegate]]>  
@property (strong, nonatomic) UIWindow *window;  
@property (strong, nonatomic) ViewController *viewController;  
   
//数据模型对象  
@property(strong,nonatomic) NSManagedObjectModel *managedObjectModel;  
//上下文对象  
@property(strong,nonatomic) NSManagedObjectContext *managedObjectContext;  
//持久性存储区  
@property(strong,nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;  
   
//初始化Core Data使用的数据库  
-(NSPersistentStoreCoordinator *)persistentStoreCoordinator;  
   
//managedObjectModel的初始化赋值函数  
-(NSManagedObjectModel *)managedObjectModel;  
   
//managedObjectContext的初始化赋值函数  
-(NSManagedObjectContext *)managedObjectContext;  
   
@end

然后在.m文件中实现定义的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
-(NSManagedObjectModel *)managedObjectModel  
{  
    if (managedObjectModel != nil) {  
        returnmanagedObjectModel;  
    }  
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];  
    return managedObjectModel;  
}  
   
-(NSPersistentStoreCoordinator *)persistentStoreCoordinator  
{  
    if (persistentStoreCoordinator != nil) {  
        returnpersistentStoreCoordinator;  
    }  
       
    //得到数据库的路径  
    NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  
    //CoreData是建立在SQLite之上的,数据库名称需与Xcdatamodel文件同名  
    NSURL *storeUrl = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"CDJournal.sqlite"]];  
    NSError *error = nil;  
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:[self managedObjectModel]];  
       
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {  
        NSLog(@"Error: %@,%@",error,[error userInfo]);  
    }  
       
    returnpersistentStoreCoordinator;  
}  
   
-(NSManagedObjectContext *)managedObjectContext  
{  
    if (managedObjectContext != nil) {  
        return managedObjectContext;  
    }  
       
    NSPersistentStoreCoordinator *coordinator =[self persistentStoreCoordinator];  
       
    if (coordinator != nil) {  
        managedObjectContext = [[NSManagedObjectContext alloc]init];  
        [managedObjectContext setPersistentStoreCoordinator:coordinator];  
    }  
       
    return managedObjectContext;  
}

另外,为了保证需要存储的数据不丢失,添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
//这个方法定义的是当应用程序退到后台时将执行的方法,按下home键执行(通知中心来调度)  
//实现此方法的目的是将托管对象上下文存储到数据存储区,防止程序退出时有未保存的数据  
- (void)applicationWillTerminate:(UIApplication *)application  
{  
    NSError *error;  
    if (managedObjectContext != nil) {  
        //hasChanges方法是检查是否有未保存的上下文更改,如果有,则执行save方法保存上下文  
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {  
            NSLog(@"Error: %@,%@",error,[error userInfo]);  
            abort();  
        }  
    }  
}

然后对xib文件进行布局并连接IBOutlet和IBAction

ViewController.h代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#import <UIKit/UIKit.h>  
#import "AppDelegate.h"  
   
@interface ViewController : UIViewController  
   
@property (retain, nonatomic) IBOutletUITextField *titleTextField;  
@property (retain, nonatomic) IBOutletUITextField *contentTextField;  
@property (strong,nonatomic) AppDelegate *myDelegate;  
@property (strong,nonatomic) NSMutableArray *entries;  
   
//单击按钮后执行数据保存操作  
- (IBAction)addToDB:(id)sender;  
   
//单击按钮后执行查询操作  
- (IBAction)queryFromDB:(id)sender;  
   
//当通过键盘在UITextField中输入完毕后,点击屏幕空白区域关闭键盘的操作  
-(IBAction)backgroundTapped:(id)sender;  
   
@end

ViewController.m代码如下:

Cpp代码  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#import "ViewController.h"  
#import "Entry.h"  
   
@interfaceViewController ()  
   
@end  
   
@implementation ViewController  
@synthesize titleTextField;  
@synthesize contentTextField;  
@synthesize myDelegate = _myDelegate;  
@synthesize entries = _entries;  
   
- (void)viewDidLoad  
{  
    [superviewDidLoad];  
    //获取当前应用程序的委托(UIApplication sharedApplication为整个应用程序上下文)  
    self.myDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];  
       
}  
   
- (void)viewDidUnload  
{  
    [selfsetTitleTextField:nil];  
    [selfsetContentTextField:nil];  
    [superviewDidUnload];  
    // Release any retained subviews of the main view.  
}  
   
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
{  
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
}  
   
- (void)dealloc {  
    [titleTextFieldrelease];  
    [contentTextFieldrelease];  
    [superdealloc];  
}  
   
//单击按钮后执行数据保存操作  
- (IBAction)addToDB:(id)sender {  
   
    //让CoreData在上下文中创建一个新对象(托管对象)  
    Entry *entry = (Entry *)[NSEntityDescription insertNewObjectForEntityForName:@"Entry" inManagedObjectContext:self.myDelegate.managedObjectContext];  
       
    [entry setTitle:self.titleTextField.text];  
    [entry setBody:self.contentTextField.text];  
    [entry setCreationDate:[NSDatedate]];  
       
    NSError *error;  
       
    //托管对象准备好后,调用托管对象上下文的save方法将数据写入数据库  
    BOOL isSaveSuccess = [self.myDelegate.managedObjectContextsave:&error];  
       
    if (!isSaveSuccess) {  
        NSLog(@"Error: %@,%@",error,[error userInfo]);  
    }else {  
        NSLog(@"Save successful!");  
    }  
}  
   
//单击按钮后执行查询操作  
- (IBAction)queryFromDB:(id)sender {  
    //创建取回数据请求  
    NSFetchRequest *request = [[NSFetchRequest alloc] init];  
    //设置要检索哪种类型的实体对象  
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entry"inManagedObjectContext:self.myDelegate.managedObjectContext];  
    //设置请求实体  
    [request setEntity:entity];  
    //指定对结果的排序方式  
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate"ascending:NO];  
    NSArray *sortDescriptions = [[NSArray alloc]initWithObjects:sortDescriptor, nil];  
    [request setSortDescriptors:sortDescriptions];  
    [sortDescriptions release];  
    [sortDescriptor release];  
       
    NSError *error = nil;  
    //执行获取数据请求,返回数组  
    NSMutableArray *mutableFetchResult = [[self.myDelegate.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];  
    if (mutableFetchResult == nil) {  
        NSLog(@"Error: %@,%@",error,[error userInfo]);  
    }  
    self.entries = mutableFetchResult;  
       
    NSLog(@"The count of entry:%i",[self.entriescount]);  
       
    for (Entry *entry inself.entries) {  
        NSLog(@"Title:%@---Content:%@---Date:%@",entry.title,entry.body,entry.creationDate);  
    }  
       
    [mutableFetchResult release];  
    [request release];  
}  
   
//更新操作  
-(void)updateEntry:(Entry *)entry  
{  
    [entry setTitle:self.titleTextField.text];  
    [entry setBody:self.contentTextField.text];  
    [entry setCreationDate:[NSDatedate]];  
       
    NSError *error;  
    BOOL isUpdateSuccess = [self.myDelegate.managedObjectContextsave:&error ];  
    if (!isUpdateSuccess) {  
        NSLog(@"Error:%@,%@",error,[error userInfo]);  
    }  
}  
   
//删除操作  
-(void)deleteEntry:(Entry *)entry  
{  
    [self.myDelegate.managedObjectContext deleteObject:entry];  
    [self.entriesremoveObject:entry];  
       
    NSError *error;  
    if (![self.myDelegate.managedObjectContext save:&error]) {  
        NSLog(@"Error:%@,%@",error,[error userInfo]);  
    }  
}  
   
//当通过键盘在UITextField中输入完毕后,点击屏幕空白区域关闭键盘的操作  
-(IBAction)backgroundTapped:(id)sender  
{  
    [titleTextField resignFirstResponder];  
    [contentTextField resignFirstResponder];  
}  
   
@end

最后运行并填入数据,点击Add后添加成功

多添加几条数据后点击Query便可以查看输出的查询结果,在命令行的输出结果如下:

以上就是对Core Data的一个简单的使用,Core Data还有很多功能,这里就不一一列举,具体的在Apple的官方文档中有详细解释。

iOS数据持久化 -- Core Data-备用的更多相关文章

  1. iOS数据持久化 -- Core Data

    Core Data是一个功能强大的层,位于SQLite数据库之上,它避免了SQL的复杂性,能让我们以更自然的方式与数据库进行交互.Core Data将数据库行转换为OC对象(托管对象)来实现,这样无需 ...

  2. iOS 数据持久化(3):Core Data

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  3. iOS数据持久化-OC

    沙盒详解 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文 ...

  4. iOS 数据持久化(扩展知识:模糊背景效果和密码保护功能)

    本篇随笔除了介绍 iOS 数据持久化知识之外,还贯穿了以下内容: (1)自定义 TableView,结合 block 从 ViewController 中分离出 View,轻 ViewControll ...

  5. iOS开发笔记-swift实现iOS数据持久化之归档NSKeyedArchiver

    IOS数据持久化的方式分为三种: 属性列表 (plist.NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等 归档(又名 ...

  6. IOS数据持久化之归档NSKeyedArchiver

    IOS数据持久化的方式分为三种: 属性列表 (自定义的Property List .NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data ...

  7. iOS -数据持久化方式-以真实项目讲解

    前面已经讲解了SQLite,FMDB以及CoreData的基本操作和代码讲解(CoreData也在不断学习中,上篇博客也会不断更新中).本篇我们将讲述在实际开发中,所使用的iOS数据持久化的方式以及怎 ...

  8. iOS数据持久化方式及class_copyIvarList与class_copyPropertyList的区别

    iOS数据持久化方式:plist文件(属性列表)preference(偏好设置)NSKeyedArchiver(归档)SQLite3CoreData沙盒:iOS程序默认情况下只能访问自己的程序目录,这 ...

  9. iOS教程:Core Data数据持久性存储基础教程

    目录[-] 创建Core Data工程 创建数据模型 测试我们的数据模型 来看看SQL语句的真面目 自动生成的模型文件 创建一个表视图 之后看些什么? 就像我一直说的,Core Data是iOS编程, ...

随机推荐

  1. 【转】FAE及其发展前景

    原文网址:http://blog.sina.com.cn/s/blog_6e80c27b0100okd9.html FAE Field Application Engineer(现场应用工程师) ,其 ...

  2. Joomla 3.x. How to edit registration page

    Adding registration form fields In order to add new fields to the registration form, database and fi ...

  3. sicily 1155 Can I Post the letter

    题意:判断有向图两点之间是否可通达! 解法:深搜或广搜(注意避免旧路重行) DFS: #include<iostream> #include<vector> #include& ...

  4. windows msiexec quiet静默安装及卸载msi软件包

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoUAAAA4CAIAAAAEgBUBAAAIj0lEQVR4nO2dQXLcOAxFdbXJ0aZys6

  5. 一、mysql分表简单介绍

    一.Mysql分表的原因 1.当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了. 分表的目的就在于此,减小数据库的负担,缩短查询时间. 2.mysql中 ...

  6. WPF - Build Error总结

    1. are you missing an assembly reference 给项目添加新控件的时候,经常发现这种错误 Error 21 The type or namespace name 'C ...

  7. oracle数据库 ORA-12560: 协议适配器错误

    ORA-12560:  协议适配器错误 造成ORA-12560: TNS: 协议适配器错误的问题的原因有三个: 1.监听服务没有起起来.windows平台个一如下操作:开始---程序---管理工具-- ...

  8. python高级编程之我不测试

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#测试驱动开发(高级编程处学习,第11章)#测试驱动开发也叫TDD, 是制造高质量软件的一种简单技 ...

  9. hibernate错题解析

    01 Hibernate错题分析   解析: 此题目考查的是对Hibernate中交叉连接的理解.HQL支持SQL风格的交叉连接查询,交叉连接适用于两个类之间没有定义任何关联时.在where字句中,通 ...

  10. App上线流程全攻略(续)-iOS8之后的改动与所遇日常错误

    随着iOS8的公布,iTunes Connect的界面也是发生了非常大的改变,App 上传到 Store上面的步骤也是发生了些改变.以下继续用图说话: /*********************** ...