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. ...
随机推荐
- Cocos2D的随机数生成函数
有很多种方法生成随机数.但是只有arc4random函数生成的最接近于"真随机(truly random)"数.(而且不需要种子) 其变体函数arc4random_uniform生 ...
- SpriteBuilder中时间线播放音效的弊端
当你美滋滋的在时间线中播放音效的时候,你要想到音效时间线并不适于播放同步于游戏事件的声音,比如碰撞和加速时. 它同样不能被用来播放背景循环的声音,这就本质上拒绝了通过timeline播放背景音乐.甚至 ...
- linux进程的介绍和管理
概述 - 在linux 中,每个执行的程序都称为一个进程,每一个进程都分配一个ID号 - 每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程,例如www服务器 - 每个进程都可 ...
- OpenGL Shader Key Points (1)
1. Shader起步 1.1. 可编程管线 仅考虑Vertex shader和fragment shader: 1.2. Shader Object 在编译阶段生成,把shader源代码编译成 ...
- Unity Editor 编写unity插件类
在unity写了一个编辑类,基于iTweenpath插件,为了更方便的操作iTweenpath,顺便练习UnityEditor的操作,写了一个CreateiTweenPath,放在Editor文件夹中 ...
- myBatis源码学习之SqlSessionFactoryBuilder
SqlSessionFactoryBuilder通过类名就可以看出这个类的主要作用就是创建一个SqlSessionFactory,通过输入mybatis配置文件的字节流或者字符流,生成XMLConfi ...
- 【Qt编程】3D迷宫游戏
说起迷宫想必大家都很熟悉,个人感觉迷宫对人的方向感是很大的考验,至少我的方向感是不好的,尤其是在三维空间中.由于这段时间帮导师做项目用到了三维作图,便心血来潮想做个三维迷宫玩玩.要想画出三维的迷宫游戏 ...
- zookeeper 应用开发
由于zookeeper的client只有zookeeper一个对象,使用也比较简单,所以就不许要文字说明了,在代码中注释下就ok 了. 1.测试用的main方法 package ClientExamp ...
- Mina源码阅读笔记(四)—Mina的连接IoConnector1
上一篇写的是IoAcceptor是服务器端的接收代码,今天要写的是IoConnector,是客户端的连接器.在昨天,我们还留下一些问题没有解决,这些问题今天同样会产生,但是都要等到讲到session的 ...
- css左侧固定宽度右侧自适应
左侧固定宽,右侧自适应屏幕宽: 左右两列,等高布局: 左右两列要求有最小高度,例如:200px;(当内容超出200时,会自动以等高的方式增高) 要求不用JS或CSS行为实现: 仔细分析试题要求,要达到 ...