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. ...
随机推荐
- 《android入门第一季》之android目录结构详解
在搭建Android开发环境及简单地建立一个HelloWorld项目后,本篇将通过HelloWorld项目来介绍Android项目的目录结构.本文的主要主题如下: 1.HelloWorld项目的目录结 ...
- 套接字编程相关函数(2:TCP套接字编程相关函数)
本文摘录自<UNIX网络编程 卷1>. 基本套接字函数 socket函数 为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型.其定义如下: #in ...
- 【一天一道LeetCode】#4 Median of Two Sorted Arrays
一天一道LeetCode (一)题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find th ...
- RedHat系列软件管理(第二版) --二进制软件包管理
RedHat系列软件管理 --二进制软件包管理 Linux学习思想-Linux相对与Windows来非常透明,因此,无论是系统,还是软件,都会有本身自带,或者是Man给提供的非常详细的说明/帮助文档, ...
- Linux - sed 工具
我们先来谈一谈 sed 好了, sed 本身也是一个管线命令,可以分析 standard input 的啦! 而且 sed 还可以将数据进行取代.删除.新增.撷取特定行等等的功能呢!很不错吧- 我们先 ...
- application之OnLowMemory()和 OnTrimMemory(level)讲解
1. OnLowMemory OnLowMemory是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLo ...
- Java数据类型之byte、char
Java 有8中基本数据类型,分别是byte.int.long.char.float.double.boolean. 1.byte.char的简单介绍 有时候总是搞不清byte.char,所以就现在好 ...
- caffe中是如何运用protobuf构建神经网络的?
caffe这个框架设计的比较小巧精妙,它采用了protobuf来作为交互的媒介,避免了繁重的去设计各个语言的接口,开发者可以使用任意语言通过这个protobuf这个媒介,来运行这个框架. 我们这里不过 ...
- LeetCode - 二叉树的最大深度
自己解法,欢迎拍砖 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,nu ...
- 听晴明老师从头讲React Native 百度云下载 百度网盘
适用人群 能使用至少一门主流编程语言:有基本的面向对象的概念:最好有一些web相关的知识和概念. 课程概述 新颖.实用.详尽的ReactNative零基础课程,由国内权威的ReactNative中文网 ...