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需要的对象,代码如下:
#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文件中实现定义的方法:
-(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;
}
另外,为了保证需要存储的数据不丢失,添加如下代码:
//这个方法定义的是当应用程序退到后台时将执行的方法,按下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代码如下:
#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代码如下:
#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的官方文档中有详细解释。
欢迎关注我的新浪微博和我交流:@唐韧_Ryan
分享到:
相关推荐
iOS实例开发源码——JTStackController for iOS.zip
iOS实例开发源码——JTListView for iOS.zip
iOS实例开发源码——JSTokenField for iOS.zip
iOS实例开发源码——JPButton for iOS.zip
iOS实例开发源码——JSFavStarControl for iOS.zip
iOS实例开发源码——JHTickerView for iOS.zip
iOS实例开发源码——JHNotificationManager for iOS.zip
iOS实例开发源码——JMWhenTapped for iOS.zip
iOS实例开发源码——KKGridView for iOS.zip
iOS实例开发源码——JHStatusTextView for iOS.zip
iOS实例开发源码——JCTiledScrollView for iOS.zip
iOS实例开发源码——NDRotator for iOS.zip
iOS实例开发源码——PhotoAppLink for iOS.zip
iOS组件与框架——iOS SDK高级特性剖析 书的配套全部源代码
IOS实例开发源码——仿iOS原生计算器.zip
iOS开发快速入门——字节跳动.pptx
iOS8自定义控件——环形滑块,国外大神的杰作!用来借鉴学习刚好!
iOS实例开发源码——gooddoug-Cravenstar-16d97a2.zip
IOS实例开发源码——局域网或蓝牙连接.zip
iOS实例开发源码——FRLayeredNavigationController.zip