CoreData的简单使用
一.基础知识:
CoreData是对SQLite的封装,使用的时候比较方便,减少对SQL语句的使用。
CoreData中的核心对象
NSManagedObjectModel:代表Core Data 的模型文件,包含模型的数据结构;
NSManagedObjectContext:负责应用和数据库之间的交互(CRUD);
NSPersistentStoreCoordinator:添加持久的数据存储仓库,通常采用NSManagedObjectModel的对象来初始化,最经常用的是NSSQLiteStoreType;
NSEntityDescription:用来描述实体对象的;
Entity:定义一个实体;
Attribute:实体的一个属性;
Relationship:关联实体;
NSFetchRequest:用来设置一个查询的请求,可以指定查询顺序;
Predicate:设置查询的条件;
Sort Descriptor:设置排序。
二.具体步骤:
1.打开Xcode,按住shift+command+N新建一个工程,勾选 Use Core Data:

2.在Appdelegate.h和.m文件中 会自动生成以下文件:
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (void)saveContext;
- (NSURL *)applicationDocumentsDirectory; @end
Appdelegate.m文件
#pragma mark - Core Data stack @synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator; - (NSURL *)applicationDocumentsDirectory {
// The directory the application uses to store the Core Data store file. This code uses a directory named "com.zhangyu.CoreDataTwo" in the application's documents directory.
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
} - (NSManagedObjectModel *)managedObjectModel {
// The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataTwo" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
} - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
// The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it.
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
} // Create the coordinator and store _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataTwo.sqlite"];
NSLog(@"---url:%@",storeURL);
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data.";
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// Report any error we got.
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
dict[NSLocalizedFailureReasonErrorKey] = failureReason;
dict[NSUnderlyingErrorKey] = error;
error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
// Replace this with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
} return _persistentStoreCoordinator;
} - (NSManagedObjectContext *)managedObjectContext {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
if (_managedObjectContext != nil) {
return _managedObjectContext;
} NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
} #pragma mark - Core Data Saving support - (void)saveContext {
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
NSError *error = nil;
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
在工程文件中还会看到红色选框中的文件:然后单击打开创建一个model,我在这里创建一个Users,并添加相应的属性user_name,user_password两个属性,声明为字符串类型。


之后选择Editor-》Create NSManagedObject SubClass创建 会在工程里直接生成Users.h和Users.m文件。
4.准备条件完成后在Storyboard中设置两个Label和两个TextField、一个segmentControl控件,并拖拉控件在ViewControloler.h中:
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *username;
@property (weak, nonatomic) IBOutlet UITextField *password; - (IBAction)segmentControl:(UISegmentedControl *)sender;
之后在ViewController中编写相应的代码:
#import "ViewController.h"
#import "AppDelegate.h"
#import "Users.h"
@interface ViewController ()
@property (nonatomic,strong)AppDelegate *myDelegate;
@property(nonatomic,strong) NSMutableArray *users;
@property(nonatomic,assign)BOOL query;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; self.myDelegate = [UIApplication sharedApplication].delegate;
self.query = NO;
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} - (IBAction)segmentControl:(UISegmentedControl *)sender { switch (sender.selectedSegmentIndex) {
case 0:
[self queryFromDB];
break;
case 1:[self addToDB];
break;
default:
break;
}
} -(void)addToDB{
//@prames entityForName参数要与所建的Entity保持一致,如建的实体是Users
Users *us = [NSEntityDescription insertNewObjectForEntityForName:@"Users" inManagedObjectContext:self.myDelegate.managedObjectContext];
us.user_name = self.username.text;//或者这种写法[us setValue:@"user_name" forKey:self.username.text]; us.user_password = self.password.text; NSError *error;
//托管对象准备好后,调用托管对象上下文的save方法将数据写入数据库
BOOL isSaveSuccess = [self.myDelegate.managedObjectContext save:&error];
if (!isSaveSuccess) { [NSException raise:@"访问数据库错误" format:@"%@",[error localizedDescription]];
NSLog(@"Error: %@,%@",error,[error userInfo]);
}else{
NSLog(@"Save successful!");
}
}
#pragma mark - 从数据库中查询数据
-(void)queryFromDB{ //创建取回数据请求
NSFetchRequest *request = [[NSFetchRequest alloc]init];
//设置要查询哪种实体的实体对象
//@prames entityForName参数要与所建的Entity保持一致
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Users" inManagedObjectContext:self.myDelegate.managedObjectContext];
//设置请求实体
[request setEntity:entity]; //指定按照什么的排序方式,无排序
NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"user_name" ascending:NO];
NSArray *sortDescriptions = [[NSArray alloc]initWithObjects:sort, nil];
[request setSortDescriptors:sortDescriptions]; NSError *error;
//执行获取数据请求,返回数组
NSMutableArray *mutableFetch = [[self.myDelegate.managedObjectContext executeFetchRequest:request error:&error]mutableCopy];
if (mutableFetch == nil) {
NSLog(@"Error: %@,%@",error,[error userInfo]);
}
self.users = mutableFetch;
NSLog(@"the count of users:%lu",(unsigned long)self.users.count);
for (Users *user in self.users) {
if ([self.username.text isEqualToString:user.user_name]) {
if ([self.password.text isEqualToString:user.user_password]) {
self.query = YES;
break;
}
} NSLog(@"--name:%@---password:%@--",user.user_name,user.user_password);
}
if (!self.query) {
[self showAlert:@"用户名或密码错误,请重新输入"];
} }
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self.username resignFirstResponder];
[self.password resignFirstResponder];
}
-(void)showAlert:(NSString*)infomation{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示:" message:infomation delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
@end
效果如图所示:

点击Add按钮会输出:Save successful 点击query会输出如下图所示:

之所以有五条数据是因为之前添加了四条数据,已经保存在CoreDataTwo.sqlite数据库中

CoreData的简单使用的更多相关文章
- 【CoreData】 简单地使用
先介绍一下什么是CoreData —— 它是在iOS5之后出现的一个框架,提供了对象-关系映射(ORM)的功能,既能够将OC对象转化成数据,保存在SQLite数据库文件中,也能将保存在数据库中的数据还 ...
- CoreData的简单使用(二)数据的增删改查,轻量级的版本迁移
上一篇中我们已经使用CoreData创建了一个SQLite数据库 CoreData的简单使用(一)数据库的创建 现在对数据库进行数据的CRUD(增删改查) 1.Data Model 的设置 创建一个D ...
- iOS 中CoreData的简单使用
原文链接:http://www.jianshu.com/p/4411f507dd9f 介绍:本文介绍的CoreData不在AppDelegate中创建,在程序中新建工程使用,即创建本地数据库,缓存数据 ...
- CoreData的简单使用(一)数据库的创建
iOS有多种数据持久化得方式 plist文件(属性列表) preference(偏好设置,NSUserDefaults) NSKeyedArchiver(归档,用的不多) SQLite 3 (需要导入 ...
- iOS 让CoreData更简单些
原文:http://www.cocoachina.com/ios/20170421/19096.html 前言 本文并不是CoreData从入门到精通之类的教程, 并不会涉及到过多的原理概念描述, 而 ...
- iOS开发CoreData的简单使用
1.简介 CoreData是iOS5后,苹果提供的原生的用于对象化管理数据并且持久化的框架.iOS10苹果对CoreData进一步进行了封装,而且效率更高!相关类的简单介绍: NSManagedObj ...
- 关于CoreData的用法
有些同事觉得CoreData是一个看不懂,理解不清的神秘东东,其实ios的本地数据储存是一个sqlite数据库,一个简易的数据库,而这个CoreData是否支持所有储存的数据呢,显然不是的,站在我的角 ...
- IOS CoreData的(增删查改)
(1).CoreDataa>什么是CoreDatab>CoreData增删改查 "什么时候使用COredata 什么时候使用FMDatabases"CoreData 在 ...
- CoreData的使用(IOS学习)
——杂言:最近开始学习IOS7的开发,下文是在已经建好的项目里加入CoreData的结构,并实现一个基于coredata的简单save,query. 1. 引入Core Data Framework. ...
随机推荐
- 网站开发进阶(四)Tomcat Server处理一个http请求的过程
Tomcat Server处理一个http请求的过程 假设来自客户的请求为: http://localhost:8080/wsota/wsota_index.jsp 1) 请求被发送到本机端口8080 ...
- CentOS 7下编译安装Boost_1_57_0
之前对库的理解太肤浅(现在也仍很肤浅),导致走了挺多的弯路,现记录以备后查. 现在可以从Boost官网下载到最新的Boost源代码boost_1_57_0.tar.gz. 现将步骤记录如下: 1. 解 ...
- ROS探索总结(十四)——move_base(路径规划)
在上一篇的博客中,我们一起学习了ROS定位于导航的总体框架,这一篇我们主要研究其中最重要的move_base包. 在总体框架图中可以看到,move_base提供了ROS导航的配置.运行.交互接口,它主 ...
- Android开发技巧——自定义控件之增加状态
Android开发技巧--自定义控件之增加状态 题外话 这篇本该是上周四或上周五写的,无奈太久没写博客,前几段把我的兴头都用完了,就一拖再拖,直到今天.不想把这篇拖到下个月,所以还是先硬着头皮写了. ...
- 配置SharePoint环境加域提示网络名不可用[已解决]
今天去客户给机器做备机,带着装好SharePoint07的机器跑过去了,先做个LAN,然后连上机器开始工作:首先当然是改ip地址,然后都改好了开始加域,加了好几次,发现都不行,提示"指定的网 ...
- SharePoint 调用WebService操作List小记
简述:在SharePoint的使用中,经常需要进行系统集成这样的操作,我们作为SharePoint开发,就需要给其他系统提供接口,而SharePoint提供的WebService就很好的提供了这样的功 ...
- j2ee5.0开发中jstl标签失效
尝试了下,对于Weblogic中的出现的错误,也是有效的! j2ee5.0开发中jstl标签失效 原因不详, 解决办法, 一:将.web.xml中 <web-app version=&quo ...
- Demo4
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- 获取list,有内容就赋值,根据ID显现NAME,没有显现list
function onTOWN() { var town=mini.get("TOWN_ID"); var town_id =town.getValue(); $.ajax({ u ...
- es6(五):class关键字(extends,super,static)
ES5中,生成对象通过构造函数: function A(name,age){ this.name=name; this.age=age } // 在A的prototype属性上定义一个test方法,即 ...